{
 "cells": [
  {
   "cell_type": "code",
   "id": "initial_id",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-09-27T14:04:56.015911Z",
     "start_time": "2024-09-27T14:04:56.011916Z"
    }
   },
   "source": [
    "import pandas as pd\n",
    "import numpy as np\n",
    "from datetime import date\n",
    "import matplotlib.pyplot as plt"
   ],
   "outputs": [],
   "execution_count": 50
  },
  {
   "cell_type": "code",
   "id": "4071cd18702b43b4",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-09-27T14:04:59.356760Z",
     "start_time": "2024-09-27T14:04:56.505627Z"
    }
   },
   "source": [
    "# 训练集\n",
    "train_LogInfo = pd.read_csv('PPD_LogInfo_3_1_Training_Set.csv', encoding='gbk')\n",
    "train_Master = pd.read_csv('PPD_Training_Master_GBK_3_1_Training_Set.csv', encoding='gbk')\n",
    "train_Userupdate = pd.read_csv('PPD_Userupdate_Info_3_1_Training_Set.csv', encoding='gbk')\n",
    "#  测试集\n",
    "test_LogInfo = pd.read_csv('PPD_LogInfo_2_Test_Set.csv', encoding='gbk')\n",
    "test_Master = pd.read_csv('PPD_Master_GBK_2_Test_Set.csv', encoding='gb18030')\n",
    "test_Userupdate = pd.read_csv('PPD_Userupdate_Info_2_Test_Set.csv', encoding='gbk')"
   ],
   "outputs": [],
   "execution_count": 51
  },
  {
   "cell_type": "code",
   "id": "61a29936a352b13c",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-09-27T14:04:59.391501Z",
     "start_time": "2024-09-27T14:04:59.360033Z"
    }
   },
   "source": [
    "train_Master\n",
    "#借款人的一些信息\n",
    "# 借款人特征字段,网络行为字段,学历学籍字段,第三方数据时间段N字段,社交网络字段,借款成交时间,违约标签（1 = 贷款违约，0 = 正常还款）。测试集里不包含target字段。"
   ],
   "outputs": [
    {
     "data": {
      "text/plain": [
       "         Idx  UserInfo_1 UserInfo_2  UserInfo_3 UserInfo_4  WeblogInfo_1  \\\n",
       "0      10001         1.0         深圳         4.0         深圳           NaN   \n",
       "1      10002         1.0         温州         4.0         温州           NaN   \n",
       "2      10003         1.0         宜昌         3.0         宜昌           NaN   \n",
       "3      10006         4.0         南平         1.0         南平           NaN   \n",
       "4      10007         5.0         辽阳         1.0         辽阳           NaN   \n",
       "...      ...         ...        ...         ...        ...           ...   \n",
       "29995   9991         3.0         南阳         4.0         南阳           NaN   \n",
       "29996   9992         3.0         宁德         4.0         泉州           NaN   \n",
       "29997   9995         1.0         天津         2.0         天津           NaN   \n",
       "29998   9997         3.0         运城         3.0         运城           NaN   \n",
       "29999   9998         4.0         金华         5.0         无锡           NaN   \n",
       "\n",
       "       WeblogInfo_2  WeblogInfo_3  WeblogInfo_4  WeblogInfo_5  ...  \\\n",
       "0               1.0           NaN           1.0           1.0  ...   \n",
       "1               0.0           NaN           1.0           1.0  ...   \n",
       "2               0.0           NaN           2.0           2.0  ...   \n",
       "3               NaN           NaN           NaN           NaN  ...   \n",
       "4               0.0           NaN           1.0           1.0  ...   \n",
       "...             ...           ...           ...           ...  ...   \n",
       "29995           1.0           NaN           3.0           2.0  ...   \n",
       "29996           0.0           NaN           6.0           1.0  ...   \n",
       "29997           0.0           NaN           2.0           2.0  ...   \n",
       "29998           0.0           NaN           1.0           1.0  ...   \n",
       "29999           0.0           NaN           1.0           1.0  ...   \n",
       "\n",
       "       SocialNetwork_10  SocialNetwork_11  SocialNetwork_12  SocialNetwork_13  \\\n",
       "0                   222                -1                 0                 0   \n",
       "1                     1                -1                 0                 0   \n",
       "2                    -1                -1                -1                 1   \n",
       "3                    -1                -1                -1                 0   \n",
       "4                    -1                -1                -1                 0   \n",
       "...                 ...               ...               ...               ...   \n",
       "29995                 0                -1                 0                 1   \n",
       "29996               407                -1                 0                 0   \n",
       "29997                -1                -1                -1                 0   \n",
       "29998               612                -1                 0                 1   \n",
       "29999                -1                -1                -1                 0   \n",
       "\n",
       "       SocialNetwork_14  SocialNetwork_15  SocialNetwork_16  SocialNetwork_17  \\\n",
       "0                     0                 0                 0                 1   \n",
       "1                     0                 0                 0                 2   \n",
       "2                     0                 0                 0                 0   \n",
       "3                     0                 0                 0                 0   \n",
       "4                     0                 0                 0                 0   \n",
       "...                 ...               ...               ...               ...   \n",
       "29995                 0                 0                 0                 1   \n",
       "29996                 0                 0                 0                 1   \n",
       "29997                 0                 0                 0                 0   \n",
       "29998                 0                 0                 0                 1   \n",
       "29999                 0                 0                 0                 0   \n",
       "\n",
       "       target  ListingInfo  \n",
       "0           0     2014/3/5  \n",
       "1           0    2014/2/26  \n",
       "2           0    2014/2/28  \n",
       "3           0    2014/2/25  \n",
       "4           0    2014/2/27  \n",
       "...       ...          ...  \n",
       "29995       0    2014/2/22  \n",
       "29996       0    2014/2/28  \n",
       "29997       0    2014/2/24  \n",
       "29998       0    2014/2/28  \n",
       "29999       0     2014/3/5  \n",
       "\n",
       "[30000 rows x 228 columns]"
      ],
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Idx</th>\n",
       "      <th>UserInfo_1</th>\n",
       "      <th>UserInfo_2</th>\n",
       "      <th>UserInfo_3</th>\n",
       "      <th>UserInfo_4</th>\n",
       "      <th>WeblogInfo_1</th>\n",
       "      <th>WeblogInfo_2</th>\n",
       "      <th>WeblogInfo_3</th>\n",
       "      <th>WeblogInfo_4</th>\n",
       "      <th>WeblogInfo_5</th>\n",
       "      <th>...</th>\n",
       "      <th>SocialNetwork_10</th>\n",
       "      <th>SocialNetwork_11</th>\n",
       "      <th>SocialNetwork_12</th>\n",
       "      <th>SocialNetwork_13</th>\n",
       "      <th>SocialNetwork_14</th>\n",
       "      <th>SocialNetwork_15</th>\n",
       "      <th>SocialNetwork_16</th>\n",
       "      <th>SocialNetwork_17</th>\n",
       "      <th>target</th>\n",
       "      <th>ListingInfo</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>10001</td>\n",
       "      <td>1.0</td>\n",
       "      <td>深圳</td>\n",
       "      <td>4.0</td>\n",
       "      <td>深圳</td>\n",
       "      <td>NaN</td>\n",
       "      <td>1.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>1.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>...</td>\n",
       "      <td>222</td>\n",
       "      <td>-1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>2014/3/5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>10002</td>\n",
       "      <td>1.0</td>\n",
       "      <td>温州</td>\n",
       "      <td>4.0</td>\n",
       "      <td>温州</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>1.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>...</td>\n",
       "      <td>1</td>\n",
       "      <td>-1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>0</td>\n",
       "      <td>2014/2/26</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>10003</td>\n",
       "      <td>1.0</td>\n",
       "      <td>宜昌</td>\n",
       "      <td>3.0</td>\n",
       "      <td>宜昌</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>2.0</td>\n",
       "      <td>2.0</td>\n",
       "      <td>...</td>\n",
       "      <td>-1</td>\n",
       "      <td>-1</td>\n",
       "      <td>-1</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>2014/2/28</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>10006</td>\n",
       "      <td>4.0</td>\n",
       "      <td>南平</td>\n",
       "      <td>1.0</td>\n",
       "      <td>南平</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>...</td>\n",
       "      <td>-1</td>\n",
       "      <td>-1</td>\n",
       "      <td>-1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>2014/2/25</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>10007</td>\n",
       "      <td>5.0</td>\n",
       "      <td>辽阳</td>\n",
       "      <td>1.0</td>\n",
       "      <td>辽阳</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>1.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>...</td>\n",
       "      <td>-1</td>\n",
       "      <td>-1</td>\n",
       "      <td>-1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>2014/2/27</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>29995</th>\n",
       "      <td>9991</td>\n",
       "      <td>3.0</td>\n",
       "      <td>南阳</td>\n",
       "      <td>4.0</td>\n",
       "      <td>南阳</td>\n",
       "      <td>NaN</td>\n",
       "      <td>1.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>3.0</td>\n",
       "      <td>2.0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>-1</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>2014/2/22</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>29996</th>\n",
       "      <td>9992</td>\n",
       "      <td>3.0</td>\n",
       "      <td>宁德</td>\n",
       "      <td>4.0</td>\n",
       "      <td>泉州</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>6.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>...</td>\n",
       "      <td>407</td>\n",
       "      <td>-1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>2014/2/28</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>29997</th>\n",
       "      <td>9995</td>\n",
       "      <td>1.0</td>\n",
       "      <td>天津</td>\n",
       "      <td>2.0</td>\n",
       "      <td>天津</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>2.0</td>\n",
       "      <td>2.0</td>\n",
       "      <td>...</td>\n",
       "      <td>-1</td>\n",
       "      <td>-1</td>\n",
       "      <td>-1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>2014/2/24</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>29998</th>\n",
       "      <td>9997</td>\n",
       "      <td>3.0</td>\n",
       "      <td>运城</td>\n",
       "      <td>3.0</td>\n",
       "      <td>运城</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>1.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>...</td>\n",
       "      <td>612</td>\n",
       "      <td>-1</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>2014/2/28</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>29999</th>\n",
       "      <td>9998</td>\n",
       "      <td>4.0</td>\n",
       "      <td>金华</td>\n",
       "      <td>5.0</td>\n",
       "      <td>无锡</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>1.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>...</td>\n",
       "      <td>-1</td>\n",
       "      <td>-1</td>\n",
       "      <td>-1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>2014/3/5</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>30000 rows × 228 columns</p>\n",
       "</div>"
      ]
     },
     "execution_count": 52,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 52
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-09-27T14:04:59.404004Z",
     "start_time": "2024-09-27T14:04:59.392508Z"
    }
   },
   "cell_type": "code",
   "source": [
    "train_LogInfo\n",
    "# 借款人的登陆信息。\n",
    "# 借款成交时间,操作代码,操作类别,登陆时间"
   ],
   "id": "97ac3abb605c7fb2",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "          Idx Listinginfo1  LogInfo1  LogInfo2    LogInfo3\n",
       "0       10001   2014-03-05       107         6  2014-02-20\n",
       "1       10001   2014-03-05       107         6  2014-02-23\n",
       "2       10001   2014-03-05       107         6  2014-02-24\n",
       "3       10001   2014-03-05       107         6  2014-02-25\n",
       "4       10001   2014-03-05       107         6  2014-02-27\n",
       "...       ...          ...       ...       ...         ...\n",
       "580546   9998   2014-03-05         2         1  2014-02-20\n",
       "580547   9998   2014-03-05         4         1  2014-02-20\n",
       "580548   9998   2014-03-05        -4         6  2014-02-20\n",
       "580549   9998   2014-03-05        -4         6  2014-03-05\n",
       "580550   9998   2014-03-05         4         7  2014-03-05\n",
       "\n",
       "[580551 rows x 5 columns]"
      ],
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Idx</th>\n",
       "      <th>Listinginfo1</th>\n",
       "      <th>LogInfo1</th>\n",
       "      <th>LogInfo2</th>\n",
       "      <th>LogInfo3</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>10001</td>\n",
       "      <td>2014-03-05</td>\n",
       "      <td>107</td>\n",
       "      <td>6</td>\n",
       "      <td>2014-02-20</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>10001</td>\n",
       "      <td>2014-03-05</td>\n",
       "      <td>107</td>\n",
       "      <td>6</td>\n",
       "      <td>2014-02-23</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>10001</td>\n",
       "      <td>2014-03-05</td>\n",
       "      <td>107</td>\n",
       "      <td>6</td>\n",
       "      <td>2014-02-24</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>10001</td>\n",
       "      <td>2014-03-05</td>\n",
       "      <td>107</td>\n",
       "      <td>6</td>\n",
       "      <td>2014-02-25</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>10001</td>\n",
       "      <td>2014-03-05</td>\n",
       "      <td>107</td>\n",
       "      <td>6</td>\n",
       "      <td>2014-02-27</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>580546</th>\n",
       "      <td>9998</td>\n",
       "      <td>2014-03-05</td>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "      <td>2014-02-20</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>580547</th>\n",
       "      <td>9998</td>\n",
       "      <td>2014-03-05</td>\n",
       "      <td>4</td>\n",
       "      <td>1</td>\n",
       "      <td>2014-02-20</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>580548</th>\n",
       "      <td>9998</td>\n",
       "      <td>2014-03-05</td>\n",
       "      <td>-4</td>\n",
       "      <td>6</td>\n",
       "      <td>2014-02-20</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>580549</th>\n",
       "      <td>9998</td>\n",
       "      <td>2014-03-05</td>\n",
       "      <td>-4</td>\n",
       "      <td>6</td>\n",
       "      <td>2014-03-05</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>580550</th>\n",
       "      <td>9998</td>\n",
       "      <td>2014-03-05</td>\n",
       "      <td>4</td>\n",
       "      <td>7</td>\n",
       "      <td>2014-03-05</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>580551 rows × 5 columns</p>\n",
       "</div>"
      ]
     },
     "execution_count": 53,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 53
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-09-27T14:04:59.419606Z",
     "start_time": "2024-09-27T14:04:59.405312Z"
    }
   },
   "cell_type": "code",
   "source": [
    "train_Userupdate\n",
    "# 借款成交时间,修改内容,修改时间"
   ],
   "id": "c3e166d35a8ce86e",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "          Idx ListingInfo1    UserupdateInfo1 UserupdateInfo2\n",
       "0       10001   2014/03/05       _EducationId      2014/02/20\n",
       "1       10001   2014/03/05         _HasBuyCar      2014/02/20\n",
       "2       10001   2014/03/05    _LastUpdateDate      2014/02/20\n",
       "3       10001   2014/03/05  _MarriageStatusId      2014/02/20\n",
       "4       10001   2014/03/05       _MobilePhone      2014/02/20\n",
       "...       ...          ...                ...             ...\n",
       "372458   9998   2014/03/05                _QQ      2014/02/20\n",
       "372459   9998   2014/03/05  _ResidenceAddress      2014/02/20\n",
       "372460   9998   2014/03/05    _ResidencePhone      2014/02/20\n",
       "372461   9998   2014/03/05   _ResidenceTypeId      2014/02/20\n",
       "372462   9998   2014/03/05    _ResidenceYears      2014/02/20\n",
       "\n",
       "[372463 rows x 4 columns]"
      ],
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Idx</th>\n",
       "      <th>ListingInfo1</th>\n",
       "      <th>UserupdateInfo1</th>\n",
       "      <th>UserupdateInfo2</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>10001</td>\n",
       "      <td>2014/03/05</td>\n",
       "      <td>_EducationId</td>\n",
       "      <td>2014/02/20</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>10001</td>\n",
       "      <td>2014/03/05</td>\n",
       "      <td>_HasBuyCar</td>\n",
       "      <td>2014/02/20</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>10001</td>\n",
       "      <td>2014/03/05</td>\n",
       "      <td>_LastUpdateDate</td>\n",
       "      <td>2014/02/20</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>10001</td>\n",
       "      <td>2014/03/05</td>\n",
       "      <td>_MarriageStatusId</td>\n",
       "      <td>2014/02/20</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>10001</td>\n",
       "      <td>2014/03/05</td>\n",
       "      <td>_MobilePhone</td>\n",
       "      <td>2014/02/20</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>372458</th>\n",
       "      <td>9998</td>\n",
       "      <td>2014/03/05</td>\n",
       "      <td>_QQ</td>\n",
       "      <td>2014/02/20</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>372459</th>\n",
       "      <td>9998</td>\n",
       "      <td>2014/03/05</td>\n",
       "      <td>_ResidenceAddress</td>\n",
       "      <td>2014/02/20</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>372460</th>\n",
       "      <td>9998</td>\n",
       "      <td>2014/03/05</td>\n",
       "      <td>_ResidencePhone</td>\n",
       "      <td>2014/02/20</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>372461</th>\n",
       "      <td>9998</td>\n",
       "      <td>2014/03/05</td>\n",
       "      <td>_ResidenceTypeId</td>\n",
       "      <td>2014/02/20</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>372462</th>\n",
       "      <td>9998</td>\n",
       "      <td>2014/03/05</td>\n",
       "      <td>_ResidenceYears</td>\n",
       "      <td>2014/02/20</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>372463 rows × 4 columns</p>\n",
       "</div>"
      ]
     },
     "execution_count": 54,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 54
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-09-27T14:04:59.427155Z",
     "start_time": "2024-09-27T14:04:59.423066Z"
    }
   },
   "cell_type": "code",
   "source": "",
   "id": "5acd299eb2940ded",
   "outputs": [],
   "execution_count": 54
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-09-27T14:04:59.726476Z",
     "start_time": "2024-09-27T14:04:59.429152Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# 合并时用于标记哪些样本来自训练集和测试集\n",
    "train_Master['sample_status'] ='train'\n",
    "test_Master['sample_status'] ='test'\n",
    "\n",
    "# 训练集和测试集的合并(axis=0,增加行）\n",
    "df_Master = pd.concat([train_Master,test_Master],axis=0).reset_index(drop=True)\n",
    "df_LogInfo=pd.concat([train_LogInfo,test_LogInfo],axis=0).reset_index(drop=True)\n",
    "df_Userupdate=pd.concat([train_Userupdate,test_Userupdate],axis=0).reset_index(drop=True)\n",
    "\n",
    "df_Master"
   ],
   "id": "cfa7b97b09ef8425",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "         Idx  UserInfo_1 UserInfo_2  UserInfo_3 UserInfo_4  WeblogInfo_1  \\\n",
       "0      10001         1.0         深圳         4.0         深圳           NaN   \n",
       "1      10002         1.0         温州         4.0         温州           NaN   \n",
       "2      10003         1.0         宜昌         3.0         宜昌           NaN   \n",
       "3      10006         4.0         南平         1.0         南平           NaN   \n",
       "4      10007         5.0         辽阳         1.0         辽阳           NaN   \n",
       "...      ...         ...        ...         ...        ...           ...   \n",
       "49994   9976         1.0       鄂尔多斯         5.0       鄂尔多斯           NaN   \n",
       "49995   9981         1.0         聊城         4.0         聊城           NaN   \n",
       "49996    999         1.0        秦皇岛         4.0        秦皇岛           NaN   \n",
       "49997   9993         4.0         广州         3.0         茂名           NaN   \n",
       "49998   9994         4.0         上海         5.0         常州           NaN   \n",
       "\n",
       "       WeblogInfo_2  WeblogInfo_3  WeblogInfo_4  WeblogInfo_5  ...  \\\n",
       "0               1.0           NaN           1.0           1.0  ...   \n",
       "1               0.0           NaN           1.0           1.0  ...   \n",
       "2               0.0           NaN           2.0           2.0  ...   \n",
       "3               NaN           NaN           NaN           NaN  ...   \n",
       "4               0.0           NaN           1.0           1.0  ...   \n",
       "...             ...           ...           ...           ...  ...   \n",
       "49994           0.0           NaN           2.0           1.0  ...   \n",
       "49995           NaN           NaN           NaN           NaN  ...   \n",
       "49996           0.0           NaN           2.0           1.0  ...   \n",
       "49997           0.0           NaN           3.0           3.0  ...   \n",
       "49998           0.0           NaN           1.0           1.0  ...   \n",
       "\n",
       "       SocialNetwork_11  SocialNetwork_12  SocialNetwork_13  SocialNetwork_14  \\\n",
       "0                    -1                 0                 0                 0   \n",
       "1                    -1                 0                 0                 0   \n",
       "2                    -1                -1                 1                 0   \n",
       "3                    -1                -1                 0                 0   \n",
       "4                    -1                -1                 0                 0   \n",
       "...                 ...               ...               ...               ...   \n",
       "49994                -1                -1                 0                 0   \n",
       "49995                -1                -1                 0                 0   \n",
       "49996                -1                -1                 0                 0   \n",
       "49997                -1                 0                 1                 1   \n",
       "49998                -1                -1                 0                 0   \n",
       "\n",
       "       SocialNetwork_15  SocialNetwork_16  SocialNetwork_17  target  \\\n",
       "0                     0                 0                 1     0.0   \n",
       "1                     0                 0                 2     0.0   \n",
       "2                     0                 0                 0     0.0   \n",
       "3                     0                 0                 0     0.0   \n",
       "4                     0                 0                 0     0.0   \n",
       "...                 ...               ...               ...     ...   \n",
       "49994                 0                 0                 0     NaN   \n",
       "49995                 0                 0                 0     NaN   \n",
       "49996                 0                 0                 0     NaN   \n",
       "49997                 0                 0                 1     NaN   \n",
       "49998                 0                 0                 0     NaN   \n",
       "\n",
       "       ListingInfo  sample_status  \n",
       "0         2014/3/5          train  \n",
       "1        2014/2/26          train  \n",
       "2        2014/2/28          train  \n",
       "3        2014/2/25          train  \n",
       "4        2014/2/27          train  \n",
       "...            ...            ...  \n",
       "49994    26/2/2014           test  \n",
       "49995    27/2/2014           test  \n",
       "49996   16/11/2013           test  \n",
       "49997    21/2/2014           test  \n",
       "49998    28/2/2014           test  \n",
       "\n",
       "[49999 rows x 229 columns]"
      ],
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Idx</th>\n",
       "      <th>UserInfo_1</th>\n",
       "      <th>UserInfo_2</th>\n",
       "      <th>UserInfo_3</th>\n",
       "      <th>UserInfo_4</th>\n",
       "      <th>WeblogInfo_1</th>\n",
       "      <th>WeblogInfo_2</th>\n",
       "      <th>WeblogInfo_3</th>\n",
       "      <th>WeblogInfo_4</th>\n",
       "      <th>WeblogInfo_5</th>\n",
       "      <th>...</th>\n",
       "      <th>SocialNetwork_11</th>\n",
       "      <th>SocialNetwork_12</th>\n",
       "      <th>SocialNetwork_13</th>\n",
       "      <th>SocialNetwork_14</th>\n",
       "      <th>SocialNetwork_15</th>\n",
       "      <th>SocialNetwork_16</th>\n",
       "      <th>SocialNetwork_17</th>\n",
       "      <th>target</th>\n",
       "      <th>ListingInfo</th>\n",
       "      <th>sample_status</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>10001</td>\n",
       "      <td>1.0</td>\n",
       "      <td>深圳</td>\n",
       "      <td>4.0</td>\n",
       "      <td>深圳</td>\n",
       "      <td>NaN</td>\n",
       "      <td>1.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>1.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>...</td>\n",
       "      <td>-1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0.0</td>\n",
       "      <td>2014/3/5</td>\n",
       "      <td>train</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>10002</td>\n",
       "      <td>1.0</td>\n",
       "      <td>温州</td>\n",
       "      <td>4.0</td>\n",
       "      <td>温州</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>1.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>...</td>\n",
       "      <td>-1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>0.0</td>\n",
       "      <td>2014/2/26</td>\n",
       "      <td>train</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>10003</td>\n",
       "      <td>1.0</td>\n",
       "      <td>宜昌</td>\n",
       "      <td>3.0</td>\n",
       "      <td>宜昌</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>2.0</td>\n",
       "      <td>2.0</td>\n",
       "      <td>...</td>\n",
       "      <td>-1</td>\n",
       "      <td>-1</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>2014/2/28</td>\n",
       "      <td>train</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>10006</td>\n",
       "      <td>4.0</td>\n",
       "      <td>南平</td>\n",
       "      <td>1.0</td>\n",
       "      <td>南平</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>...</td>\n",
       "      <td>-1</td>\n",
       "      <td>-1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>2014/2/25</td>\n",
       "      <td>train</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>10007</td>\n",
       "      <td>5.0</td>\n",
       "      <td>辽阳</td>\n",
       "      <td>1.0</td>\n",
       "      <td>辽阳</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>1.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>...</td>\n",
       "      <td>-1</td>\n",
       "      <td>-1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>2014/2/27</td>\n",
       "      <td>train</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>49994</th>\n",
       "      <td>9976</td>\n",
       "      <td>1.0</td>\n",
       "      <td>鄂尔多斯</td>\n",
       "      <td>5.0</td>\n",
       "      <td>鄂尔多斯</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>2.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>...</td>\n",
       "      <td>-1</td>\n",
       "      <td>-1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>26/2/2014</td>\n",
       "      <td>test</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>49995</th>\n",
       "      <td>9981</td>\n",
       "      <td>1.0</td>\n",
       "      <td>聊城</td>\n",
       "      <td>4.0</td>\n",
       "      <td>聊城</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>...</td>\n",
       "      <td>-1</td>\n",
       "      <td>-1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>27/2/2014</td>\n",
       "      <td>test</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>49996</th>\n",
       "      <td>999</td>\n",
       "      <td>1.0</td>\n",
       "      <td>秦皇岛</td>\n",
       "      <td>4.0</td>\n",
       "      <td>秦皇岛</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>2.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>...</td>\n",
       "      <td>-1</td>\n",
       "      <td>-1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>16/11/2013</td>\n",
       "      <td>test</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>49997</th>\n",
       "      <td>9993</td>\n",
       "      <td>4.0</td>\n",
       "      <td>广州</td>\n",
       "      <td>3.0</td>\n",
       "      <td>茂名</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>3.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>...</td>\n",
       "      <td>-1</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>NaN</td>\n",
       "      <td>21/2/2014</td>\n",
       "      <td>test</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>49998</th>\n",
       "      <td>9994</td>\n",
       "      <td>4.0</td>\n",
       "      <td>上海</td>\n",
       "      <td>5.0</td>\n",
       "      <td>常州</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>1.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>...</td>\n",
       "      <td>-1</td>\n",
       "      <td>-1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>28/2/2014</td>\n",
       "      <td>test</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>49999 rows × 229 columns</p>\n",
       "</div>"
      ]
     },
     "execution_count": 55,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 55
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-09-27T14:04:59.780474Z",
     "start_time": "2024-09-27T14:04:59.728574Z"
    }
   },
   "cell_type": "code",
   "source": "df_Master.isnull().sum()",
   "id": "822d0d149f0d183a",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Idx                     0\n",
       "UserInfo_1             11\n",
       "UserInfo_2            469\n",
       "UserInfo_3             12\n",
       "UserInfo_4            410\n",
       "                    ...  \n",
       "SocialNetwork_16        0\n",
       "SocialNetwork_17        0\n",
       "target              19999\n",
       "ListingInfo             0\n",
       "sample_status           0\n",
       "Length: 229, dtype: int64"
      ]
     },
     "execution_count": 56,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 56
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-09-27T14:05:00.216215Z",
     "start_time": "2024-09-27T14:04:59.781475Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# 按列（属性）统计缺失值个数，\n",
    "# 缺失值数量的前15个字段\n",
    "missing_values = df_Master.isnull().sum()\n",
    "top_missing_values = missing_values[missing_values > 0].nlargest(15)/(df_Master.shape[0])\n",
    "print(top_missing_values)\n",
    "\n",
    "# 绘制柱状图\n",
    "plt.figure(figsize=(10, 5))\n",
    "top_missing_values.plot(kind='bar', color='skyblue')\n",
    "plt.title('每列缺失值数量')\n",
    "plt.xlabel('列名')\n",
    "plt.ylabel('缺失值数量')\n",
    "plt.xticks(rotation=45)\n",
    "plt.show()"
   ],
   "id": "419f618aa0aad801",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "WeblogInfo_1     0.967519\n",
      "WeblogInfo_3     0.967519\n",
      "UserInfo_11      0.632113\n",
      "UserInfo_12      0.632113\n",
      "UserInfo_13      0.632113\n",
      "target           0.399988\n",
      "WeblogInfo_20    0.267085\n",
      "WeblogInfo_21    0.101122\n",
      "WeblogInfo_19    0.097862\n",
      "WeblogInfo_2     0.056081\n",
      "WeblogInfo_4     0.055901\n",
      "WeblogInfo_5     0.055901\n",
      "WeblogInfo_6     0.055901\n",
      "UserInfo_2       0.009380\n",
      "WeblogInfo_23    0.008640\n",
      "dtype: float64\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "D:\\Anaconda\\Lib\\site-packages\\IPython\\core\\pylabtools.py:152: UserWarning: Glyph 21015 (\\N{CJK UNIFIED IDEOGRAPH-5217}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "D:\\Anaconda\\Lib\\site-packages\\IPython\\core\\pylabtools.py:152: UserWarning: Glyph 21517 (\\N{CJK UNIFIED IDEOGRAPH-540D}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "D:\\Anaconda\\Lib\\site-packages\\IPython\\core\\pylabtools.py:152: UserWarning: Glyph 32570 (\\N{CJK UNIFIED IDEOGRAPH-7F3A}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "D:\\Anaconda\\Lib\\site-packages\\IPython\\core\\pylabtools.py:152: UserWarning: Glyph 22833 (\\N{CJK UNIFIED IDEOGRAPH-5931}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "D:\\Anaconda\\Lib\\site-packages\\IPython\\core\\pylabtools.py:152: UserWarning: Glyph 20540 (\\N{CJK UNIFIED IDEOGRAPH-503C}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "D:\\Anaconda\\Lib\\site-packages\\IPython\\core\\pylabtools.py:152: UserWarning: Glyph 25968 (\\N{CJK UNIFIED IDEOGRAPH-6570}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "D:\\Anaconda\\Lib\\site-packages\\IPython\\core\\pylabtools.py:152: UserWarning: Glyph 37327 (\\N{CJK UNIFIED IDEOGRAPH-91CF}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "D:\\Anaconda\\Lib\\site-packages\\IPython\\core\\pylabtools.py:152: UserWarning: Glyph 27599 (\\N{CJK UNIFIED IDEOGRAPH-6BCF}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<Figure size 1000x500 with 1 Axes>"
      ],
      "image/png": "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cSLQw8mSlJQUPffcc6pVq5Zmz56tRx55RAcOHNCOHTu0devWQA/PL8uXL9drr72mI0eOBHoo18XMmTPVrVs3Pf/88+rRo4ckBe2bQEmaNWuWevfurZ49e2r16tW+ywP56fqjjz6q9u3ba/r06cqVKxeF6r8SExPVunVrSdL999+v48eP691339XkyZMlyffmPZikp6fr008/VefOnSUpaPcmeB+b5ORk1a5dW7GxsXrnnXc0Y8YMScHx2KSmpuqVV17RPffcozlz5mjq1Klq0qSJ1q1bF+ihZVmVKlUUGhqqH3/8UbNmzVJycrJcLtdle3rt7sKFC2rSpInq1q2r119/XZK0YcMGbdiwQT/99FNgB5cF6enpGjhwoO6++27NmzdPU6ZMkTFG33//fVDkWbNmjRYtWqQFCxb4DlW3++s7K+Lj4/XYY48pd+7cqlOnjmbPnq3Dhw9nWsZKbvZUBYHQ0FD1799f//jHPzR48GCNGTNGJUuWDPSw/HLq1CnlyZNHAwcOlCT98MMPOn/+vAYMGKCDBw+qd+/eevbZZwM7yGuUN29eff311woLC1P//v1VunTpQA8py6ZMmaLly5dr2LBhOnXqlGbNmqW33347aPcgTpw4UcuXL9fAgQP11ltvac+ePXrooYckKWB74NLT0xUSEqKUlBTdc889WrVqlRYtWqTWrVsH7SfM18uaNWtUrlw535uqM2fOaOXKlXr//fflcrn06quvBt3f58CBAypZsqT27t2r1q1ba9GiRUG5x+rTTz/VzTffrBEjRki6+Ni89tprmjZtmowxeuWVV2z/2MTHx8vlcqlDhw6SpIiICBUrVkxr165VWlqaQkJCbJ/hUoUKFVKhQoVUpkwZff/99woJCdHLL7+skydP6oYbbgj08K7Z9u3blStXLjVu3FiS1KNHDx05ckSpqak6cuSIevbsGTTvCSQpJCREFy5cUNu2bSVJXbp00bFjxyRJBw8etHWe8ePHa/Xq1apatapWrlypLVu2aPz48UH32rgW7777rmrWrKmRI0dKkqKjo/Xee+8pKSlJVatW1XPPPWcpd/Cs4f+izp07p02bNumee+7Rp59+qt27d2vQoEE6efJkoIfml9OnT+u3335TcnKyfvzxR7lcLn322WeaO3euXn/9dU2bNk07duwI9DCvycmTJ/XII49o27ZtGjhwoG/FGWyOHj2q9evXa/r06apTp45atmypWrVq6fjx44EeWpbs27dP69at0/vvv6+GDRuqdu3a+vrrr9WlSxf17NlTycnJcrvdOTZhhHfvhPdTr5EjR2rOnDl69dVXNXjwYC1cuNC38v6rTmJx6tQpxcbG+n6OiIhQ06ZN1aFDB23YsEGrVq0K4OiyJi4uTuXLl9ebb76ppKQkRUVFSQq+PVaHDx/WuXPnJF18fkZERKhOnTpq0qSJvv/+e3377bcBHuGfS0xM1Pbt23Xw4EHfZSVKlFBkZKRCQ0OD8k3jjTfeqMqVK6tbt266++67tXnzZj399NO+Pb7BsseqQoUKqlevnlasWKHRo0crLi5OH3/8sebMmaMxY8ZoypQp2r59e6CHeU08Ho/i4+N17NgxnTx5Ut98843vPL7Zs2dr7NixmjRpkn744YdAD/Uy0dHR+uqrr7R06VJNmjRJn3zyiVatWqXdu3cHemjZYu/evSpYsKAkqVu3bjp9+rTuuOMOFSxYUIsWLdKHH35o6fdTqmwuJCREw4YNU6VKlRQREaHFixdr9+7dGjx4cFAVq6pVq+rzzz9XwYIFVaNGDS1YsEBhYWEqWLCg6tSpoxtuuEHnz58P9DD/kPfN8Y8//qgqVapoyZIlOnDggAYNGhSUxerChQs6e/asbwUjSUWLFvW9yc34BjAY3gz+/vvvOnv2rCIiIrRhwwbNmzdPTZo00V133aX9+/fr6aeflnTxNZXd0tPT5Xa7tX//fr3xxhsaNGiQ741Dp06d1LdvXw0ePFjR0dGaMmWKY07S9le9evV0+vRpRUdH+y4rUKCAHn74Yd1www1BcdjMpXbu3KlHHnlEVatWDepiVbNmTSUkJGjt2rW+Pa3fffed7rnnHuXKlUs7d+4M9BD/VJkyZTR06FDlzZvXd9mvv/6aaY9hr1699N133wVieFlSpEgRHT16VGfOnFH37t2VkpKinTt3qmXLlpKksLCwwA7wGkVERKh169b6+uuv9eOPP2rAgAHKlSuXChcurDp16qhcuXI6e/ZsoId5Tdxut/Lnz682bdronXfe0dKlS/X4449LkvLnz6/7779fFStW1KlTpwI80ssdPXpU9913n/Lmzau0tDQVLVpUefLkUUJCQqCHli1atmyp9u3bS5KeeeYZ/fvf/9ZTTz2lAQMG6G9/+5vl9Rqlyuby5cunu+66S9LFT6BKlCih6Oho/fLLL3rllVd05syZwA7QD+Hh4b5Zz7wbtbCwMBUpUkSFCxdWaKg9j0bdsWOHEhIS5HK5lJSUpIceekjt2rVTkSJFFB0drV9//VUDBw4Muj08t956q0qUKKGff/7Zd1l8fLzcbreMMXK73b5Pq4LhsKU77rhDvXr1Ur58+XTHHXfogw8+0PPPP69OnTpp1qxZOnv2rDZv3pwjYwkJCdH+/fvVvn175c6dW+XKldP+/fvVuHFjnT59Wh07dlTfvn01efJkrVu3TnfffXeOjCvQMs7CtmHDBt16661q1KiRPvvss0znv0VEROiOO+7Q4cOHbV1CLs0jSR07dlSLFi0kXfw0fvLkyUpOTla7du0k2fe1dOkssxUqVFDlypU1YcIEPf7442rdurUKFCigNm3aqEqVKkEze2vz5s1Vs2ZN38+xsbG66aabJEl9+/bV9u3bg2ZCAe/2s0iRIoqPj9eiRYt04MABtWzZUj/88IMWLlwY4BFeO2OMKleurOHDh6tQoUIqUqSIpIunOxQuXFh58uQJunN6GjRooLvvvlsrV670vR/IlSuX8ufPb7s9o96/bVxcnE6fPi2Px6PQ0FAVKVJExYsXzzQRV0pKSqCGaVnGdfTmzZvVqFEj3XDDDUpJSVH16tUlXcwXHh6ucuXKWf5w357vYpGJ95P1sLAwpaWlqXjx4vrXv/6lYcOGqXDhwoEdnJ+8xWn58uVKT09X+fLl9cEHHygpKcn3BLcLY4xvpraoqCi1bNlSefPmVb169ZQrVy6lpKQoIiJCS5YsUVRUlF599VVNnjzZ1udY7dixQzfffLPy5csnl8ulN998M9P5eXFxcbrtttvkcrn07bff6vnnn9e8efMyvSmxk4x5ChQooBYtWigtLU358+dXrVq1ZIxRWlqawsPDVaBAAeXPnz9HxuXxePTuu++qVatW6t27t9LT07VixQo1atRI58+fV968efX888/r0UcfVYkSJXyHJebEXrRAuXQWtv/85z+aPn26OnTooClTpmjBggVKSEjwfeK+fft2FS9e3LYl5Eqzyo0bN853Dp908Ty+2267TZMnT1aHDh00ePBgjR49OoCjvrpLZ5m98cYb1b17dx08eFAHDhxQ6dKl9cADD0i6eAjN7bffHtgBXyPv88d7Ttu5c+dUt25djR07Vrt27dKKFSt821a7frDn5R1fzZo11b17d6Wnpys6OlrFixfXRx99pFatWgV4hNfOO9HJAw88oHvvvVfnzp3T5s2bFRkZqWnTpikpKUl16tQJ9DD9UrZsWbVu3VqnT5/WxIkTFRYWpsjISH311VdKSEhQo0aNAj1EH2/B69Chg1avXu17nRw+fFgnT55UeHi4JGn9+vVat26devfurTx58gRsvFmRcR2dkpKi3bt3+2b+9M72d/LkSd97oJ9++sn6+zeDoJOamprp5/T09ACNJGuSk5PNrFmzTLVq1cwzzzxjXnzxRZOSkmKMsV+WQ4cOmUqVKpnHH3/czJs3zyQkJGS63vtYxMTEmDp16pht27YFYph/yuPxmJ9//tm0atXKzJ8/3yQmJvouN8b4/v7NmjUzq1atMjt37jQ1atQwn3/+ecDG/Ef+LI8xxsTHx/v+v2XLFtO0aVNz6NChbBvTpc/dTp06mS+//NIYY0zz5s1N7969jcfjMVFRUWbhwoV/eFunSUlJMR06dDCjRo0yxlx8vQwaNMgMHjzYGGPMrl27zLhx40yDBg1My5YtzXPPPWdatGjhe17azZXyDB482AwZMuSqtzl8+LBJS0vLqSH6bdiwYaZixYqmS5cu5tixY5dd/91335lhw4aZ7t27m6ZNm162HbI7j8djPB6PeeKJJ0zFihVN69atfc+vYMvywQcfmIYNG17xcbLzc+xqkpOTzdKlS80dd9xhnnjiCdOhQwffYxMseTJue/bv32+mTJli7rnnHvPss8+a3r172zLPlbY7O3bsMHXr1jXGGLNu3Tpzxx13mCVLluT00Cy7lnX0tm3bTNu2bU379u1N586dTbNmzSxvc+z9sQyu6NJP0+z6Se7V5MqVS506dVLLli2VL18+5c2bVy6Xy5afFMbFxalevXqKiIjQ559/LpfLpVatWik8PFzGGIWGhiotLU0RERG+GQHtyOVyqWDBgtq1a5eWLVsmY4wee+wxXw7vuEuXLq0vvvhC33zzjYYNG6YmTZr4DhOw06ELf5YnNTVVAwcO1M6dO1W1alV99913GjJkiG688cZsG5Pb7dbJkydVsGBBhYeHK3/+/JozZ45mzJihO+64w7eHIiUlRbfccstlt3WyK83CVrx4cX311VdKTU1VpUqVVLp0aUVFRWnDhg0qWbKkHnzwQd/ry27rBX9mlTP/neGxbNmykmTbPZIZZ5kdMmSIRo8erVKlSkn632FnCQkJuu222zRx4kSFhobaNsuVeB+PypUry+Vy6f3337ft8+vPtG/fXi1atFCBAgUuewyC5fHIKFeuXGrWrJkqVaqkggUL+vZQB9Njk/G722655Rb16NFDzz77rAoVKuRbxm6vl4zbHe/Yjx49qooVK2rLli3q2bOnxo0b53sfYKf3AH/mz9bRoaGhKl68uDp37qxt27apdOnSat26teX1WnA8W+FIxYsX971Ivcfz2s26deuUJ08ejR07ViNHjtRnn30mSZcVK+nysms3f1QQvYfGHD9+XHv27NHbb7+thg0b2rJQef1RHrfbrb59+yo6OlqRkZF64oknVLNmzWzZMHhXwImJiXrhhRcUERGhd955R08//bRGjhyp2NhYX6Hynox95513Xtcx2F3GWdi8xbZEiRIqU6aMr9AXLFhQBQsWVPny5X23S09Pt+Xr6mp5vLPKZXTp881Ob6q8vLPMRkVFqXnz5mrevHmmr+8IDQ3Vvffeq3vvvdd3G7u9QbxWUVFRuu2224LuTbuXd11doEABeTyeoHwMrqZChQq+/9v1PcEfufS1nvFwc7s/Vt6xh4WF6d///re2bNmikSNHZvpgNZhcyzo6MjJSkZGRql+/vu92Vtdrzv541Ob8faLa+YmdlSwZV0B2/aT+iSee8H1Py8CBA1WxYkV99tln+vTTT5WYmJgpgx2LR0YZC2KlSpX02WefKTo6WhcuXPD9/du0aaM5c+bYvlBJV8+TmJio0NBQ3XDDDerWrZuioqJ854Rd7yzeDeWuXbs0ePBglS5dWhs3blTXrl1Vrlw5de7cWeXKlVPdunXVsWNHHT16VB9++KFCQkL+UtOoZ3UWNru+CXHarHJZmWXWDo9NVraJlSpV8s3CaKc37deaxfscM/+dTMiu/H1sLp2Qxm7ZsvIeJ+NrxG55rqZ06dIKDw/XhAkT1LRpU9u/D7iaa11HX/rVEFbXay5j53fqDpbx0+3k5GTlzp1buXLlUmho6BW/JDJjCZk7d67S0tL0wgsvBGLol3FSlqvxfqLp8Xg0duxY/fjjj4qKitITTzwRNCvLmJgYhYaGqlChQkpLS9OYMWO0Z88eNW/eXM2aNVO+fPmUkpKiXLlyBcWK9I/yNG/ePNPKNDsdP35cbdu21csvv6wGDRooPj5eXbt2VZkyZTRlyhTlz59fGzduVPHixVWuXLmg/YTcqkvXBX369FHJkiXVt29f9e3bV1u3bvVNGhAMnJbHux5PTU1VWFiYTp06paioKBUvXlzvvPOOIiIiAj3ETJy03XFSFok8ds9zNcYYGWN08uRJRUZG+n4Olvc4lwrEOjo4/1JBzvsC3bNnjzp16qQXX3xR7dq106RJk3T8+HHflNZeGV+gH374oaZMmWKbKZidlOWPeI+zdbvdGjRokO68805Vrlw5qFY2RYsW9RWQ0NBQDRkyRJUrV9aCBQsUHR2t9PR038rF5XLZulBJf54nO6fizvi7Dx06pNKlS+vJJ59UyZIlVb58ed8XdQ8YMEDJycmqXbu2r1DZ7RPynJJxFjbp4iFnFSpUuOIsbMHAaXmuNstssWLFbDfLrJO2O07KIpHHTnn83QZ6zwuLjIxUamqq7z1PsArIOtrSNBfwS8bZYQ4ePGjuuece8+6775r9+/eb9957z7z44oumR48eJiYm5oq3mTdvnqlVq5bZuXNnjo77SpyUxR92mrnHCm8Oj8djhg4darZs2RLgEVmTk3m8MyYdPHjQ7Nixw3zxxRemYcOG5sKFC8YY45uJsFevXqZixYqmU6dOvttmfA38VTlpFjZjnJfHy46zzDppu+OkLMaQ59LbBDpPxvcqJ06cMCdOnPCN9WrboYyzGffp08fExsZm+zhzQk6uoylVOeTcuXOmW7du5sSJE8YYY2bMmGGGDh2aaZnPPvvMPPbYY+aHH34wxmR+UXhfoDt27Mi5QV+Fk7L8lTmlIHrlRB7vG8vDhw+bu+++26xcudIkJiaaunXrmgEDBmRadsiQISY6OtrUq1fPvPHGG9k+tmAzatQo8+STT/o2asFcQIxxXh67cdJ2x0lZjCGPMfbKk3Es/fv3N88884xp0KCBad++vVm/fr0x5vJi5V1fxcbGmgcffNB8/fXXOTbenJIT6+jg3a8XRFJSUvTMM8/ozjvvVMmSJWWM0fnz5/Xbb78pNTXVt9yjjz6q8+fPa8eOHZL+dzjGhx9+qLfeektz5swJ+BcuOinLX50dTjS/nnIij9vt1unTpzVhwgQ1a9ZMjRo18p3Uu2rVKj333HOaNm2aXn75ZW3cuFEtW7ZU27Ztdfbs2WwfW7CJiorSBx98ELTTWl/KaXnsxEnbHSdlkchjxzzesfTu3VsHDhzQuHHjNGDAAFWpUkVdunTRhg0bMh3e711fxcbGqnXr1hoxYoTvi76dJCfW0ZSqHBAXF6fY2FidPXtWjz/+uPbs2aPChQsrJiZG+/fvz7RsuXLlMn2j8/LlyzVy5EjNnTvXFiscp2TJyvk23uNu09LSsvV8HdiT+e9x8+vWrdPu3bv17bffKikpSZJ0zz33aOnSpSpZsqRiYmIUGRnpm37/zJkzvhOajXHmvEBZyWXXWdgkZ+XxN4sdn6NO2e5IzsoikcdOecaMGaPVq1fLGKMjR47o999/1/Tp01WqVCk1aNBAnTt3VsuWLfXBBx8oISFBxphMhSoqKkrDhg3Tfffdl+Nj95dt19HXfd8XMvHuYh03bpypWLGi6dy5szHm4u7Z5s2bm6ioKLNgwQKzdetW069fP9O8efNMuyTPnz9v9u3bF5CxX8opWZx2rHFWznXIuPvbDudKZGS3PN7nS8b7+Pzzz03Tpk1Nv379fOdSZbRnzx6ze/duM2vWLFOjRg3zyy+/XNcx2Yn375OQkGDOnDljEhISfH+rKz0WGV9jc+bMMe+++27ODPQaOSmPE7I4ZbtjjLOyGEMeO+X55JNPzN13323i4+NNbGysOXDggLn99tvNtm3bjDH/yzZ79mwTFRWVadxnzpwxDz74oPnmm28CMnZ/2Xm9Zp+P0xzK5XIpNTVVv//+ux544AGtXbtWc+fO1bPPPqtFixapX79++uSTT3zf7rxw4ULfTHPSxS+Py/gFcoHkhCwZv9htwIABOn78uI4eParIyEh17txZdevWvew7tLyf5MTFxSkqKkpDhw61zWxYGfN4v08mLCxMERERV/2iW2+eM2fO6PXXX9egQYPI8yfj2bdvn2bOnKlixYqpTp06atKkiVJSUvTJJ59o1KhRGjZsmHLlyqX09HS5XC7NmTNHBw4ckMvl0gcffJDpSy2dJOPMWKNGjVJSUpKSk5NVt25ddejQwTctr/dxM1eYGeuf//xnICNk4qQ8TsnihO2Ol5OySOSxS56UlBQdOXJE5cuX19ChQxUREaGuXbuqRo0a+vLLL1WmTBkVLVpUkhQREaESJUooOTlZISEhSk5OVqdOnTRs2DDdf//9OT52f9l+vZZtde0vztukvZ9ie/eEvP/++6ZixYpm9uzZvmVjYmLMmTNnfG3abic4OymLV69evUy7du3M8ePHzZo1a8y4cePMHXfcYb777rtMy3nHf+bMGVO/fn2zbt26QAz3ipx2Mqrd8njHs3v3blOrVi3Tv39/06JFC/Pkk0+aVatWGWOMiY6ONu3btzddu3b1zSZkjDEpKSkmISHBxMfHX7fx2Emwz4x1KSflcUoWJ213nJTFGPLYMU9KSoqpWLGiqVmzpvn999+NMca88847pl27dmbYsGFmxYoVZtmyZaZatWpm9erVmW578ODBQAzZL8GyXqNUZQPv7sdffvnFdOrUyXTu3NlER0ebc+fOGWMuvlArVapk3n///ctua7cpl52SZfTo0WbVqlXG4/GYw4cPm/bt25vTp0/7ro+NjTVDhgwxL7/8somPjzcej+eyQmXXXeNOKIgZBTrPqVOnfP8/c+aMadasme/5HR0dbZo3b27at2/v2zB9/PHHZujQob7Xit0Op7zegn1mrEs5KY9Tsjhlu2OMs7IYQ56MAp3He/8pKSnm3//+t2nSpImpW7eu6dixo69YLViwwPTs2dM8+OCDplOnTr4PBD0eT9DMABxM6zVK1XWWccrlGjVqmHHjxplOnTqZ1q1bm3fffdf3Qv3ggw9MxYoVzYoVKwI53D/klCxOO9bYaQXRTnnOnz9vJk6caI4ePWpOnTplvvzyS9OmTRtjjDFnz541Xbt2NX//+99Nx44dTdOmTc2sWbMy3d7phSo5Odm0atXKd0y6x+Mx48ePN88//3ymPXXGGPPQQw+ZOXPmZLps/vz5tnjT7uWkPE7J4pTtjjHOymIMeeyUJ2NpyPj6Tk5ONnXq1DEdOnTItNcmNjbWJCQkGGP+971NwSDY1mucU3Wdud1unTx5Up988oleeuklvfDCC5KkKVOmaNWqVXK73WrTpo3at2+vYsWKqWHDhgEe8dU5IYvTjjVeuHChli5dqp49e+rs2bNKT0/X1q1b9dtvv6lo0aIyxqhw4cK6+eabtWvXLuXOnVsulyvTdKnDhw8nz1XExsZq1apV+s9//qNjx46pffv2KlWqlM6cOaMXX3xRFStW1EsvvSRJ+vzzz/XLL79kOmY7mL99/lpcOjPW8OHDM82MValSJd+yV5sZa/HixapcuXIghn8ZJ+VxShYnbHe8nJRFIo9d8hhjfOcejxo1SgcPHlSpUqXUunVrVa9eXUuWLFHLli3Vt29fjRw5UmXKlMl0nvGVzk22q2Bbrzn7HUAOSU5O1oYNGyRdfLLPnTtXc+bMyTTtds+ePXXvvfdq1apVmjt3rhISEvTwww/75su3CydlkaRcuXKpa9eu2rJli9atW6dOnTqpUKFCqlu3rjZu3Khp06bpiy++0GeffaYRI0aoVatWypcvn1wul/LkyaOJEyeqXr16gY4h6fKCOH36dBUpUsRXEGNiYnwry4wF0RijpKQk2xVEO+YpW7as+vfvr40bNyosLEwNGzbUxIkTdfDgQYWFhWns2LGSpH379umRRx7RhAkT5HK5bDkN9fVmjFGJEiX08MMP691331XhwoVVqVIlPf/88/J4PBoyZIj+9a9/6aefflL//v118uRJ1a9f33f7+++/X59//nnA37R7OSlPsGdx0nbHSVkk8tgtj3cyJEnq3r27tm3bpttvv10nTpzQ5MmTtXnzZhUrVkxLlizRli1bNHDgQCUnJwd0zFkVjOs1StV1MHnyZL355ptas2aNXC6XHn30UdWuXVsffPCBbwYzSXr11Vd1++236/fff1fevHl9l9vpO02cksX7Jjc1NVWbNm1S+fLllSdPHvXv31+nTp3Siy++qMcee0xnz57VG2+8oWXLlmn8+PFq2LChjDG+2XxuuummQMbIxEkFUbJvnrJly6pbt24yxmjcuHE6cuSI3G63YmNjNWvWLPXu3Vv79u1Tp06d5HK55PF4guqTv6y62sxYISEhWrRokW688UZ98sknGj9+vBITEzPNjJWenq78+fOrfPnygY7h46Q8wZ7FKdsdyVlZJPLYLY93D9X69et1ww03aOHCherVq5e6dOmikiVL6q233tKPP/6oYsWKadWqVXrppZeUO3fugI45q4JyvZYjBxk63LFjx0y3bt1Mx44dzZo1a4wxxuzdu9d06tTJtGjRwhw+fDjT8t5jWe14TKsTsjjtWGOnnYwaLHl++eUX88gjj5hevXqZtWvXmsmTJ5vWrVubXr16+Z5XdvvbZgcnzIyVkZPyOCWLE7Y7Xk7KYgx57JLnyy+/NOfPnzfGGPP111+bihUrmoceesg3eYMxxmzcuNH07dvXPPbYY2bTpk2+ywM9dn8F83qNUmXBpV8i+/LLL2d6oe7evdu89NJLpmXLlubAgQOZbmu3J7lTsmQcy8iRI03Hjh3NwIEDzY8//miMuTizW506dUzHjh3N0aNHAzXMa+a0ghhseX755RfTqFEjM2jQINOmTRvz+uuv+05uDvTKOycE88xYV+KkPE7I4pTtjjHOymIMeTIKdJ7du3ebli1bml69evm+pmPevHnm//7v/8yiRYsyLfvdd9+ZHj16mK1btwZgpNYF+3qNw/+yyPz3RMEDBw5oxYoVKlmypIYNG6bcuXPrww8/1JdffqmKFSvq1VdfVZ48efT3v/890+3tdLiQU7I47Vhjc8nJqC+99JIGDRqkLVu2KFeuXFqyZIn279+vvn376rfffpMkFS5c2Heogsvlss1jIwVnngoVKujtt99Wenq6IiMj1adPH7ndbnk8noAfBpLdPB6P3G63jhw5oieeeEK33HKLjDGaN2+eFixYoPPnz6tDhw4aNGiQxo4dqy+++CLT7e303JOclccJWZyy3ZGclUUij93y3HrrrWrfvr3i4uI0fPhwJSQk6KmnnlLPnj01aNAgLV682LfsvffeqxEjRuiuu+4K3ICzyAnrNfZUZYH3E4+4uDgzbtw4U7FiRbN8+XJjTOZPQL788ktjzMXpOu061bKTsnitW7fOjB8/3vfz5s2bTa9evUz79u3N5s2bjTHG/P7775d975GdZPxUrVu3bqZ169Zm0qRJpmPHjuapp57yfRfDqVOnzF133WU6dOhgkpKSAjXcPxXseZKTk33//yvsofI6ceKEmTRpkm86W2OMefPNN02bNm3MP/7xD9+nhytWrAiKv4uT8gRzFidtd5yUxRjy2ClPxnHs27fPfPLJJ+bpp582ffv29e2xmjVrlqlSpYr5+OOPAzXM6yqY12vGsKfKb+a/n3js3r1bjz32mNLT01WuXDn17t1bixcv9n0CkjdvXr399tvavHmzypYt6/t0206ckuWrr75SfHy8JGnt2rV68cUXtWbNGt9JpzVq1FC7du0UGRmpsWPH6ocfflDx4sV177332nbWNqedjBrseXLlyiXp4mvGyXuogn1mrEs5KY9TsjhluyM5K4tEHjvl8e61kaSXXnpJCxYsULNmzdSqVSudOHFCI0aMUEJCgjp16qSXXnpJw4YN04kTJwI65qxwynrNJzBdLrjFxcWZFi1aZDqmc8GCBaZSpUomOjraGGPMb7/9ZiZOnGj7E9mDPYvTjjV22smoTsvjdGPHjjVt2rQxq1evNsYY8/PPP5vnn3/e1K1bN9NjZszFcxYHDx5s68fJSXmclCXYtzsZOSmLMeSxmzlz5phnnnnG9/4mJSXFLF682Dz99NOmf//+vu3rpRNsBAsnrdeMYaKKLImNjTWtW7c2P//8szHmf7toX3/9dVOlShXz+eefZ7rcLruSryTYs6SlpZmFCxeajh07mj59+mTaJV6pUqXLilVcXFwghnlNnFYQnZbnryBYZ8a6GiflcVKWYN/uZOSkLMaQx055vvvuO9OqVStTv35934RNxlwsVtHR0SYqKsr06tXLpKWl2fr1/kectF4zhsP/rom55BCx8+fP6+TJk76T6VNTUyVJFStWVJkyZdS7d299++23crvdMsb4duHagVOyeHcNh4SE6K677tIjjzyikydPZtol/uqrr2rYsGFasGCB73aFChUK1JD/lNNORnVaHifzfi9bZGSkBg0alOkE7ltvvVW9evVSZGSkunfvroMHD/pu5/3iY1ucIJyBk/I4IYtTtjuSs7JI5LFTnksPOaxataqefvppuVwujRw50jf2sLAwPfroo3r88cfVoUMHhYSE+F7ndni9XwsnrNeuKOd7XHDx7g4+d+6cOX78uDl58qQxxpj33nvPVKlSxfz000++ZQcMGGA+/vhj8+abb5pHHnnEnDlzJiBjvhqnZMn4SVLnzp3NmDFjTFJSkm+XeMaTON9++21TsWJFc/z48UAN90857WRUp+VxOu8nfr/++usVT+D2fnq4Z88e8/jjj5vXXnstYGO9Fk7K44QsTtnuGOOsLMaQx055Mh56uG3bNvPDDz+YgwcPGmOMiY6ONu3atTNDhgyx5eQM/nLCeu1qXMbY9Ex9G/CeKLhnzx4NGDBAuXLl0tGjR/XAAw+oefPm+u677/Tee++pdu3aOn/+vOLi4vT5559r586deuuttzRz5kzbnGzvpCxec+fO1dq1azV9+nTly5dPqamp+uyzzxQdHa0yZcpo0KBByp8/v44cOaKyZcsGerhXdOnJqDfeeKN69+6t5cuXKzo6WqVKldKwYcOUL18+TZ8+XdOmTdPatWtVqlSpAI/8ypyWx+nS09MVEhKis2fPaubMmZozZ47efPPNTHt+k5OT9dRTT6l+/fo6cuSIypQpY7tPp72clMcJWZy03XFSFok8dspjMux56d69u06fPq2YmBgVLVpUlStX1uDBg/Wvf/1Ly5YtU+nSpTV69GiFhYUFZKxWOWG9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zJTqKSkpypUrl/bu3at33nlHv//+u8qWLevb7Tht2jQtX75chQoV0k033aT9+/fro48+suX36jgpi3Rxdr8NGzborbfeUkREhDp27Og71vihhx7yHWs8depUzZw507a7xj0ej7766ivNmDFDN954o0aMGKEuXbroxIkTvoL4xhtv+Ari+++/f1lBtBOn5fmruHRmLO9hJXv27NEzzzzj+yTUTjNj/REn5QnmLE7a7jgpi0QeO+bZtGmTBg0apKefflrNmjXzfeeSt0js3LlTvXr10nvvvZfpULhgFMzrtevNXh9NZIPk5GTfC3T//v165plnVKFCBT3xxBOKiIhQly5d9Ouvv+qpp57So48+qqNHj6pUqVJasGCBwsLClJaWFugIPk7K4pVxl3j37t117tw5zZ8/Xy+99JIaN26sZcuWKTo6Wj169FDHjh1tW6ik/52M2rNnTx05csR3MmqbNm1Uv359LVy4UDVr1lTevHmD4mRUp+VxqqSkJEVHR0uSDh06pMcee0yffvqpxowZo169emnx4sUaPny4brvtNn300UeaP3++0tLSfBs3Y4ytHjsn5XFCFidtd5yURSKPnfPcfffdev31133fp+k9FNDr6NGjKlGiRFBO5uSE9Vp2cWaq/0pPT9egQYMUHh6ukSNHasWKFXr44YfVqVMnSdI777yjxx9/XJL0+++/68knn1SpUqX02GOP+Y7JtcsD76QsP//8s8qUKaOIiIjLjjWWpBkzZmjo0KFq1KiRli5dqlKlSmnChAlq2LChbU48vRKnnYzqtDxOFewzY13KSXmCPYuTtjtOyiKRx+55JKlmzZp644031K9fP3k8Hj388MMqVaqUvvvuO/Xv31/jx49XREREoIfpt2Bfr2Unez0DrzOPx6PixYtrz549OnPmjH799VffF5C2bNlSt9xyi4YPH65nn31WderU0YsvvqioqCjfbe10jLFTsjjtWGOnFUSn5fkrCPaZsS7lpDzBnsUp2x3JWVkk8tg9j1fNmjU1YcIEjRkzRosWLVL58uW1fft2jRkzRo0aNbLNa90fwb5ey072fBZeJ2FhYercubP27dunDz/8UE2bNtXGjRvVqFEj3XnnnZo8ebIkKTExUZGRkZLke+NutxeoU7JERkZq5syZmj9/vpYuXarY2FhJFz+5SE9PV1hYmG6//XadOHHCNytM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"
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "execution_count": 57
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-09-27T14:05:01.699008Z",
     "start_time": "2024-09-27T14:05:00.217235Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# 缺失占比超过80%的变量列表\n",
    "missing_columns=[]\n",
    "for column in df_Master.columns:\n",
    "    if sum(pd.isnull(df_Master[column]))/len(df_Master)>=0.8:\n",
    "        missing_columns.append(column)\n",
    "print(len(missing_columns))\n",
    "print(missing_columns)\n",
    "# 筛掉缺失大于80%的变量\n",
    "# 列229 - 227\n",
    "df_Master = df_Master.loc[:,list(~df_Master.columns.isin(missing_columns))]\n",
    "df_Master.shape"
   ],
   "id": "9a36d8829233b7a8",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "2\n",
      "['WeblogInfo_1', 'WeblogInfo_3']\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "(49999, 227)"
      ]
     },
     "execution_count": 58,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 58
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-09-27T14:05:01.714097Z",
     "start_time": "2024-09-27T14:05:01.700011Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# 将缺失值用-1 填充，相当于“是否缺失”当成另一种类别\n",
    "df_Master[['UserInfo_11', 'UserInfo_12', 'UserInfo_13']] = df_Master[['UserInfo_11', 'UserInfo_12', 'UserInfo_13']].fillna(-1)"
   ],
   "id": "c7407199f85e6a5e",
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\31838\\AppData\\Local\\Temp\\ipykernel_19720\\153515376.py:2: SettingWithCopyWarning: \n",
      "A value is trying to be set on a copy of a slice from a DataFrame.\n",
      "Try using .loc[row_indexer,col_indexer] = value instead\n",
      "\n",
      "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
      "  df_Master[['UserInfo_11', 'UserInfo_12', 'UserInfo_13']] = df_Master[['UserInfo_11', 'UserInfo_12', 'UserInfo_13']].fillna(-1)\n"
     ]
    }
   ],
   "execution_count": 59
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-09-27T14:05:01.878147Z",
     "start_time": "2024-09-27T14:05:01.715337Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# UserInfo_12\n",
    "df_Master['UserInfo_12'].unique()\n",
    "fig=plt.figure()\n",
    "fig.set(alpha=0.2)\n",
    "target_UserInfo_12_not = df_Master.target[df_Master.UserInfo_12.isnull()].value_counts()\n",
    "target_UserInfo_12_ = df_Master.target[df_Master.UserInfo_12.notnull()].value_counts()\n",
    "df_UserInfo_12 = pd.DataFrame({'missing':target_UserInfo_12_not,'not_missing':target_UserInfo_12_})\n",
    "df_UserInfo_12.plot(kind='bar', stacked=True)\n",
    "plt.title(u'有无这个特征对结果的影响')\n",
    "plt.xlabel(u'有无')\n",
    "plt.ylabel(u'违约情况')\n",
    "plt.show()"
   ],
   "id": "701bcca6e4c28a33",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<Figure size 640x480 with 0 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "D:\\Anaconda\\Lib\\site-packages\\IPython\\core\\pylabtools.py:152: UserWarning: Glyph 26377 (\\N{CJK UNIFIED IDEOGRAPH-6709}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "D:\\Anaconda\\Lib\\site-packages\\IPython\\core\\pylabtools.py:152: UserWarning: Glyph 26080 (\\N{CJK UNIFIED IDEOGRAPH-65E0}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "D:\\Anaconda\\Lib\\site-packages\\IPython\\core\\pylabtools.py:152: UserWarning: Glyph 36829 (\\N{CJK UNIFIED IDEOGRAPH-8FDD}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "D:\\Anaconda\\Lib\\site-packages\\IPython\\core\\pylabtools.py:152: UserWarning: Glyph 32422 (\\N{CJK UNIFIED IDEOGRAPH-7EA6}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "D:\\Anaconda\\Lib\\site-packages\\IPython\\core\\pylabtools.py:152: UserWarning: Glyph 24773 (\\N{CJK UNIFIED IDEOGRAPH-60C5}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "D:\\Anaconda\\Lib\\site-packages\\IPython\\core\\pylabtools.py:152: UserWarning: Glyph 20917 (\\N{CJK UNIFIED IDEOGRAPH-51B5}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "D:\\Anaconda\\Lib\\site-packages\\IPython\\core\\pylabtools.py:152: UserWarning: Glyph 36825 (\\N{CJK UNIFIED IDEOGRAPH-8FD9}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "D:\\Anaconda\\Lib\\site-packages\\IPython\\core\\pylabtools.py:152: UserWarning: Glyph 20010 (\\N{CJK UNIFIED IDEOGRAPH-4E2A}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "D:\\Anaconda\\Lib\\site-packages\\IPython\\core\\pylabtools.py:152: UserWarning: Glyph 29305 (\\N{CJK UNIFIED IDEOGRAPH-7279}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "D:\\Anaconda\\Lib\\site-packages\\IPython\\core\\pylabtools.py:152: UserWarning: Glyph 24449 (\\N{CJK UNIFIED IDEOGRAPH-5F81}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "D:\\Anaconda\\Lib\\site-packages\\IPython\\core\\pylabtools.py:152: UserWarning: Glyph 23545 (\\N{CJK UNIFIED IDEOGRAPH-5BF9}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "D:\\Anaconda\\Lib\\site-packages\\IPython\\core\\pylabtools.py:152: UserWarning: Glyph 32467 (\\N{CJK UNIFIED IDEOGRAPH-7ED3}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "D:\\Anaconda\\Lib\\site-packages\\IPython\\core\\pylabtools.py:152: UserWarning: Glyph 26524 (\\N{CJK UNIFIED IDEOGRAPH-679C}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "D:\\Anaconda\\Lib\\site-packages\\IPython\\core\\pylabtools.py:152: UserWarning: Glyph 30340 (\\N{CJK UNIFIED IDEOGRAPH-7684}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "D:\\Anaconda\\Lib\\site-packages\\IPython\\core\\pylabtools.py:152: UserWarning: Glyph 24433 (\\N{CJK UNIFIED IDEOGRAPH-5F71}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "D:\\Anaconda\\Lib\\site-packages\\IPython\\core\\pylabtools.py:152: UserWarning: Glyph 21709 (\\N{CJK UNIFIED IDEOGRAPH-54CD}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ],
      "image/png": "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"
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "execution_count": 60
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-09-27T14:05:01.886779Z",
     "start_time": "2024-09-27T14:05:01.879597Z"
    }
   },
   "cell_type": "code",
   "source": [
    "df_Master.loc[(df_Master.UserInfo_12.isnull(),'UserInfo_12')] = 2.0\n",
    "df_Master['UserInfo_11'].fillna(2.0)\n",
    "df_Master['UserInfo_12'] = df_Master['UserInfo_12'].astype(np.int32)\n",
    "df_Master['UserInfo_12'].dtypes\n",
    "df_Master['UserInfo_12'].unique\n"
   ],
   "id": "bf2a25f0a68a95ac",
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\31838\\AppData\\Local\\Temp\\ipykernel_19720\\3114709307.py:3: SettingWithCopyWarning: \n",
      "A value is trying to be set on a copy of a slice from a DataFrame.\n",
      "Try using .loc[row_indexer,col_indexer] = value instead\n",
      "\n",
      "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
      "  df_Master['UserInfo_12'] = df_Master['UserInfo_12'].astype(np.int32)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<bound method Series.unique of 0       -1\n",
       "1        0\n",
       "2        0\n",
       "3        0\n",
       "4       -1\n",
       "        ..\n",
       "49994   -1\n",
       "49995    0\n",
       "49996    0\n",
       "49997    1\n",
       "49998   -1\n",
       "Name: UserInfo_12, Length: 49999, dtype: int32>"
      ]
     },
     "execution_count": 61,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 61
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-09-27T14:05:02.066322Z",
     "start_time": "2024-09-27T14:05:01.887788Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# UserInfo_11\n",
    "df_Master['UserInfo_11'].unique()\n",
    "fig=plt.figure()\n",
    "fig.set(alpha=0.2)\n",
    "target_UserInfo_11_not = df_Master.target[df_Master.UserInfo_11.isnull()].value_counts()\n",
    "target_UserInfo_11_ = df_Master.target[df_Master.UserInfo_11.notnull()].value_counts()\n",
    "UserInfo_11 = pd.DataFrame({'missing':target_UserInfo_11_not,'not_missing':target_UserInfo_12_})\n",
    "df_UserInfo_12.plot(kind='bar', stacked=True)\n",
    "plt.title(u'有无这个特征对结果的影响')\n",
    "plt.xlabel(u'有无')\n",
    "plt.ylabel(u'违约情况')\n",
    "plt.show()"
   ],
   "id": "6d19d7059e93deee",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<Figure size 640x480 with 0 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "D:\\Anaconda\\Lib\\site-packages\\IPython\\core\\pylabtools.py:152: UserWarning: Glyph 26377 (\\N{CJK UNIFIED IDEOGRAPH-6709}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "D:\\Anaconda\\Lib\\site-packages\\IPython\\core\\pylabtools.py:152: UserWarning: Glyph 26080 (\\N{CJK UNIFIED IDEOGRAPH-65E0}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "D:\\Anaconda\\Lib\\site-packages\\IPython\\core\\pylabtools.py:152: UserWarning: Glyph 36829 (\\N{CJK UNIFIED IDEOGRAPH-8FDD}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "D:\\Anaconda\\Lib\\site-packages\\IPython\\core\\pylabtools.py:152: UserWarning: Glyph 32422 (\\N{CJK UNIFIED IDEOGRAPH-7EA6}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "D:\\Anaconda\\Lib\\site-packages\\IPython\\core\\pylabtools.py:152: UserWarning: Glyph 24773 (\\N{CJK UNIFIED IDEOGRAPH-60C5}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "D:\\Anaconda\\Lib\\site-packages\\IPython\\core\\pylabtools.py:152: UserWarning: Glyph 20917 (\\N{CJK UNIFIED IDEOGRAPH-51B5}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "D:\\Anaconda\\Lib\\site-packages\\IPython\\core\\pylabtools.py:152: UserWarning: Glyph 36825 (\\N{CJK UNIFIED IDEOGRAPH-8FD9}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "D:\\Anaconda\\Lib\\site-packages\\IPython\\core\\pylabtools.py:152: UserWarning: Glyph 20010 (\\N{CJK UNIFIED IDEOGRAPH-4E2A}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "D:\\Anaconda\\Lib\\site-packages\\IPython\\core\\pylabtools.py:152: UserWarning: Glyph 29305 (\\N{CJK UNIFIED IDEOGRAPH-7279}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "D:\\Anaconda\\Lib\\site-packages\\IPython\\core\\pylabtools.py:152: UserWarning: Glyph 24449 (\\N{CJK UNIFIED IDEOGRAPH-5F81}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "D:\\Anaconda\\Lib\\site-packages\\IPython\\core\\pylabtools.py:152: UserWarning: Glyph 23545 (\\N{CJK UNIFIED IDEOGRAPH-5BF9}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "D:\\Anaconda\\Lib\\site-packages\\IPython\\core\\pylabtools.py:152: UserWarning: Glyph 32467 (\\N{CJK UNIFIED IDEOGRAPH-7ED3}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "D:\\Anaconda\\Lib\\site-packages\\IPython\\core\\pylabtools.py:152: UserWarning: Glyph 26524 (\\N{CJK UNIFIED IDEOGRAPH-679C}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "D:\\Anaconda\\Lib\\site-packages\\IPython\\core\\pylabtools.py:152: UserWarning: Glyph 30340 (\\N{CJK UNIFIED IDEOGRAPH-7684}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "D:\\Anaconda\\Lib\\site-packages\\IPython\\core\\pylabtools.py:152: UserWarning: Glyph 24433 (\\N{CJK UNIFIED IDEOGRAPH-5F71}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "D:\\Anaconda\\Lib\\site-packages\\IPython\\core\\pylabtools.py:152: UserWarning: Glyph 21709 (\\N{CJK UNIFIED IDEOGRAPH-54CD}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ],
      "image/png": "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"
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "execution_count": 62
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-09-27T14:05:02.077856Z",
     "start_time": "2024-09-27T14:05:02.070318Z"
    }
   },
   "cell_type": "code",
   "source": [
    "df_Master.loc[(df_Master.UserInfo_11.isnull(),'UserInfo_11')] = 2.0\n",
    "df_Master['UserInfo_11'] = df_Master['UserInfo_12'].astype(np.int32)\n",
    "df_Master['UserInfo_11'].dtypes\n",
    "df_Master['UserInfo_11'].unique"
   ],
   "id": "ba4b96b3f3a59696",
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\31838\\AppData\\Local\\Temp\\ipykernel_19720\\2497533687.py:2: SettingWithCopyWarning: \n",
      "A value is trying to be set on a copy of a slice from a DataFrame.\n",
      "Try using .loc[row_indexer,col_indexer] = value instead\n",
      "\n",
      "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
      "  df_Master['UserInfo_11'] = df_Master['UserInfo_12'].astype(np.int32)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<bound method Series.unique of 0       -1\n",
       "1        0\n",
       "2        0\n",
       "3        0\n",
       "4       -1\n",
       "        ..\n",
       "49994   -1\n",
       "49995    0\n",
       "49996    0\n",
       "49997    1\n",
       "49998   -1\n",
       "Name: UserInfo_11, Length: 49999, dtype: int32>"
      ]
     },
     "execution_count": 63,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 63
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-09-27T14:05:02.254514Z",
     "start_time": "2024-09-27T14:05:02.079862Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# UserInfo_13\n",
    "df_Master['UserInfo_13'].unique()\n",
    "fig=plt.figure()\n",
    "fig.set(alpha=0.2)\n",
    "target_UserInfo_13_not = df_Master.target[df_Master.UserInfo_13.isnull()].value_counts()\n",
    "target_UserInfo_13_ = df_Master.target[df_Master.UserInfo_13.notnull()].value_counts()\n",
    "df_UserInfo_13 = pd.DataFrame({'missing':target_UserInfo_13_not,'not_missing':target_UserInfo_13_})\n",
    "df_UserInfo_13.plot(kind='bar', stacked=True)\n",
    "plt.title(u'有无这个特征对结果的影响')\n",
    "plt.xlabel(u'有无')\n",
    "plt.ylabel(u'违约情况')\n",
    "plt.show()"
   ],
   "id": "a4be63d499807518",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<Figure size 640x480 with 0 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "D:\\Anaconda\\Lib\\site-packages\\IPython\\core\\pylabtools.py:152: UserWarning: Glyph 26377 (\\N{CJK UNIFIED IDEOGRAPH-6709}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "D:\\Anaconda\\Lib\\site-packages\\IPython\\core\\pylabtools.py:152: UserWarning: Glyph 26080 (\\N{CJK UNIFIED IDEOGRAPH-65E0}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "D:\\Anaconda\\Lib\\site-packages\\IPython\\core\\pylabtools.py:152: UserWarning: Glyph 36829 (\\N{CJK UNIFIED IDEOGRAPH-8FDD}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "D:\\Anaconda\\Lib\\site-packages\\IPython\\core\\pylabtools.py:152: UserWarning: Glyph 32422 (\\N{CJK UNIFIED IDEOGRAPH-7EA6}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "D:\\Anaconda\\Lib\\site-packages\\IPython\\core\\pylabtools.py:152: UserWarning: Glyph 24773 (\\N{CJK UNIFIED IDEOGRAPH-60C5}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "D:\\Anaconda\\Lib\\site-packages\\IPython\\core\\pylabtools.py:152: UserWarning: Glyph 20917 (\\N{CJK UNIFIED IDEOGRAPH-51B5}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "D:\\Anaconda\\Lib\\site-packages\\IPython\\core\\pylabtools.py:152: UserWarning: Glyph 36825 (\\N{CJK UNIFIED IDEOGRAPH-8FD9}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "D:\\Anaconda\\Lib\\site-packages\\IPython\\core\\pylabtools.py:152: UserWarning: Glyph 20010 (\\N{CJK UNIFIED IDEOGRAPH-4E2A}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "D:\\Anaconda\\Lib\\site-packages\\IPython\\core\\pylabtools.py:152: UserWarning: Glyph 29305 (\\N{CJK UNIFIED IDEOGRAPH-7279}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "D:\\Anaconda\\Lib\\site-packages\\IPython\\core\\pylabtools.py:152: UserWarning: Glyph 24449 (\\N{CJK UNIFIED IDEOGRAPH-5F81}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "D:\\Anaconda\\Lib\\site-packages\\IPython\\core\\pylabtools.py:152: UserWarning: Glyph 23545 (\\N{CJK UNIFIED IDEOGRAPH-5BF9}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "D:\\Anaconda\\Lib\\site-packages\\IPython\\core\\pylabtools.py:152: UserWarning: Glyph 32467 (\\N{CJK UNIFIED IDEOGRAPH-7ED3}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "D:\\Anaconda\\Lib\\site-packages\\IPython\\core\\pylabtools.py:152: UserWarning: Glyph 26524 (\\N{CJK UNIFIED IDEOGRAPH-679C}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "D:\\Anaconda\\Lib\\site-packages\\IPython\\core\\pylabtools.py:152: UserWarning: Glyph 30340 (\\N{CJK UNIFIED IDEOGRAPH-7684}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "D:\\Anaconda\\Lib\\site-packages\\IPython\\core\\pylabtools.py:152: UserWarning: Glyph 24433 (\\N{CJK UNIFIED IDEOGRAPH-5F71}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "D:\\Anaconda\\Lib\\site-packages\\IPython\\core\\pylabtools.py:152: UserWarning: Glyph 21709 (\\N{CJK UNIFIED IDEOGRAPH-54CD}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ],
      "image/png": "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"
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "execution_count": 64
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "",
   "id": "8e994f7284bb4955"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-09-27T14:05:02.266564Z",
     "start_time": "2024-09-27T14:05:02.255611Z"
    }
   },
   "cell_type": "code",
   "source": [
    "df_Master.loc[(df_Master.UserInfo_11.isnull(),'UserInfo_13')] = 2.0\n",
    "df_Master['UserInfo_13'] = df_Master['UserInfo_13'].astype(np.int32)\n",
    "df_Master['UserInfo_13'].dtypes\n",
    "df_Master['UserInfo_13'].unique"
   ],
   "id": "3280322d851bfdc9",
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\31838\\AppData\\Local\\Temp\\ipykernel_19720\\3926368901.py:2: SettingWithCopyWarning: \n",
      "A value is trying to be set on a copy of a slice from a DataFrame.\n",
      "Try using .loc[row_indexer,col_indexer] = value instead\n",
      "\n",
      "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
      "  df_Master['UserInfo_13'] = df_Master['UserInfo_13'].astype(np.int32)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<bound method Series.unique of 0       -1\n",
       "1        1\n",
       "2        1\n",
       "3        1\n",
       "4       -1\n",
       "        ..\n",
       "49994   -1\n",
       "49995    1\n",
       "49996    1\n",
       "49997    1\n",
       "49998   -1\n",
       "Name: UserInfo_13, Length: 49999, dtype: int32>"
      ]
     },
     "execution_count": 65,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 65
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-09-27T14:05:02.476370Z",
     "start_time": "2024-09-27T14:05:02.267572Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# 其他缺失值比率较小的数值型属性则用中值填充。\n",
    "for column in df_Master.select_dtypes(include=['float64', 'int64']).columns:\n",
    "    median_value = df_Master[column].median()\n",
    "    df_Master[column].fillna(median_value, inplace=True)\n",
    "for column in df_Master.select_dtypes(include=['object']).columns:\n",
    "    median_value = \"不详\"\n",
    "    df_Master[column].fillna(median_value, inplace=True)"
   ],
   "id": "a56a7affbd8f93e0",
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\31838\\AppData\\Local\\Temp\\ipykernel_19720\\1477925343.py:4: SettingWithCopyWarning: \n",
      "A value is trying to be set on a copy of a slice from a DataFrame\n",
      "\n",
      "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
      "  df_Master[column].fillna(median_value, inplace=True)\n",
      "C:\\Users\\31838\\AppData\\Local\\Temp\\ipykernel_19720\\1477925343.py:7: SettingWithCopyWarning: \n",
      "A value is trying to be set on a copy of a slice from a DataFrame\n",
      "\n",
      "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
      "  df_Master[column].fillna(median_value, inplace=True)\n"
     ]
    }
   ],
   "execution_count": 66
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-09-27T14:05:02.523535Z",
     "start_time": "2024-09-27T14:05:02.477375Z"
    }
   },
   "cell_type": "code",
   "source": "df_Master.isnull().sum()",
   "id": "dcd9df33b04ba20a",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Idx                 0\n",
       "UserInfo_1          0\n",
       "UserInfo_2          0\n",
       "UserInfo_3          0\n",
       "UserInfo_4          0\n",
       "                   ..\n",
       "SocialNetwork_16    0\n",
       "SocialNetwork_17    0\n",
       "target              0\n",
       "ListingInfo         0\n",
       "sample_status       0\n",
       "Length: 227, dtype: int64"
      ]
     },
     "execution_count": 67,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 67
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-09-27T14:05:02.640737Z",
     "start_time": "2024-09-27T14:05:02.524605Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# 统计每一行的缺失值数量\n",
    "train_missing_counts = df_Master[df_Master['sample_status']=='train'].isnull().sum(axis=1)\n",
    "test_missing_counts = df_Master[df_Master['sample_status']=='test'].isnull().sum(axis=1)\n",
    "test_missing_counts"
   ],
   "id": "dd6aac1cb7dfc841",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "30000    0\n",
       "30001    0\n",
       "30002    0\n",
       "30003    0\n",
       "30004    0\n",
       "        ..\n",
       "49994    0\n",
       "49995    0\n",
       "49996    0\n",
       "49997    0\n",
       "49998    0\n",
       "Length: 19999, dtype: int64"
      ]
     },
     "execution_count": 68,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 68
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-09-27T14:05:02.645254Z",
     "start_time": "2024-09-27T14:05:02.641657Z"
    }
   },
   "cell_type": "code",
   "source": [
    "\n",
    "# # 将缺失值数量和索引组合成 DataFrame，并排序\n",
    "# train_sorted_missing_counts = train_missing_counts.reset_index(name='Missing Count').sort_values(by='Missing Count')\n",
    "# \n",
    "# # 打印排序后的缺失值统计\n",
    "# print(\"每一行的缺失值数量（从小到大排序）:\")\n",
    "# print(train_sorted_missing_counts)\n",
    "# \n",
    "# # 绘制折线图\n",
    "# plt.figure(figsize=(10, 5))\n",
    "# plt.plot(train_sorted_missing_counts['index'], train_sorted_missing_counts['Missing Count'], marker='o')\n",
    "# plt.title('每一行的缺失值数量（从小到大排序）')\n",
    "# plt.xlabel('样本序号')\n",
    "# plt.ylabel('缺失值个数')\n",
    "# plt.xticks(ticks=np.arange(len(df_Master)), labels=train_sorted_missing_counts['index'].values)\n",
    "# plt.grid()\n",
    "# plt.show()"
   ],
   "id": "e0e882ba865d8193",
   "outputs": [],
   "execution_count": 69
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-09-27T14:05:02.661790Z",
     "start_time": "2024-09-27T14:05:02.646260Z"
    }
   },
   "cell_type": "code",
   "source": "df_Master.info()",
   "id": "29474f9fbfa464d7",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "RangeIndex: 49999 entries, 0 to 49998\n",
      "Columns: 227 entries, Idx to sample_status\n",
      "dtypes: float64(34), int32(3), int64(169), object(21)\n",
      "memory usage: 86.0+ MB\n"
     ]
    }
   ],
   "execution_count": 70
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-09-27T14:05:02.920423Z",
     "start_time": "2024-09-27T14:05:02.664233Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# 剔除常变量\n",
    "# 计算每个数值型特征的标准差\n",
    "\n",
    "std_devs = df_Master.select_dtypes(exclude=['object']).std().sort_values(ascending=True).head(10)\n",
    "# 绘制条形图\n",
    "plt.figure(figsize=(8, 5))\n",
    "std_devs.plot(kind='bar', color='skyblue')\n",
    "plt.title('Standard Deviations of Non-String Columns')\n",
    "plt.xlabel('Columns')\n",
    "plt.ylabel('Standard Deviation')\n",
    "plt.xticks(rotation=45)\n",
    "plt.grid(axis='y')\n",
    "\n",
    "# 显示图形\n",
    "plt.show()"
   ],
   "id": "98f5dd38cc42fe2d",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<Figure size 800x500 with 1 Axes>"
      ],
      "image/png": "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s7Oz6l9GRkZZRSEiIiKiD5xeedxpQEAA7OzscPHiRSQkJGDSpEnYs2cPxo4dq7ZeTEwMpk6dirVr16JDhw44c+YMAgICcObMGdjZ2SE6Ohq5ubm4du0aDAwMyiMKEREREX3gynwP78OHDxEZGYnp06fD2NgY9vb28PX1xcGDBwuse+LECbi4uKBLly7Q09NDjx494OrqitDQUADAjRs3UK9ePZZdIiIiIipSmRfeqKgoWFpaws7OTrWsTp06iIuLw8uXL9XWjY6OhpOTk9qyunXr4s6dOwDyC292djY8PT3RqlUrDB06FNeuXSv9EERERESkNcq88Kanp8PY2FhtmfLn1+feFraukZGRaj0jIyM0adIEISEhOH/+PDp16oQxY8YgNja2FBMQERERkTYp8zm8JiYmyMzMVFum/NnU1FRtubGxMbKystSWZWVlqdabNWuW2mVjxozB8ePHceHCBQwbNqykh05EREREWqjM9/A6OjoiJSUFCQkJqmX37t1D5cqVYWZmprauk5MToqKi1JZFR0fD0dERALBu3Tr8888/apfn5OTA0NCwlEZPRERERNqmzAuvg4MDWrRogWXLliEtLQ2xsbEICQmBl5dXgXU9PDwQGRmJ8PBwyOVyhIeHIzIyEn369AEA3L17F0FBQXj+/DlycnKwceNGpKWl4ZNPPinrWERERET0gSqX8/AGBwdDLpejc+fOGDhwINzd3eHr6wsAcHZ2xqlTpwDkH8y2adMmbN26Fa6urggJCcGGDRtQq1YtAMDy5ctRo0YN9OnTB25uboiMjMTu3bthaWlZHrGIiIiI6ANULufhtbW1RXBwcKGXXb9+Xe1nd3d3uLu7F7qupaUlli9fXuLjIyIiIiLx4FcLExEREZGosfASERERkaix8BIRERGRqLHwEhEREZGosfASERERkaix8BIRERGRqLHwEhEREZGosfASERERkaix8BIRERGRqLHwEhEREZGosfASERERkaix8BIRERGRqLHwEhEREZGosfASERERkaix8BIRERGRqLHwEhEREZGosfASERERkaix8BIRERGRqLHwEhEREZGosfASERERkaix8BIRERGRqLHwEhEREZGosfASERERkaix8BIRERGRqLHwEhEREZGosfASERERkaix8BIRERGRqLHwEhEREZGosfASERERkajpabJyeno6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URlSnpP2XSm/eexdKBQCz0VLRCVOo8KrVKdOHUyZMgVOTk5Yv349du7cycJLRCQC/MYxIhIjjQvvpUuXcPLkSfz4449wcHDAmDFj4OHhURpjIyKiMsZvHCMiMdKo8LZv3x7p6eno0aMH9u3bh0aNGpXWuIiIqBzxG8eISEw0Krx+fn7o0aMHv1mNiIiIiLSGRkcWeHp6IjMzE3v27EFQUBDS0tJw7ty50hobEREREdF706jw3rp1C926dcP333+PsLAwJCcnw9/fH8eOHSut8RERERERvReNCu/y5csxa9YsfPXVV9DT04O9vT02bdqEnTt3ltb4iIiIiIjei0aF9+7du+jTpw8AQCLJP2WNu7s74uPjS35kREREREQlQKPCa21tjfv376stu3//PmxtbUt0UEREREREJUWjwuvt7Y0JEybgyJEjkMvlCA8Ph7+/PwYNGlRa4yMiIiIiei8anZZsxIgRkMlk2Lt3LxQKBdavX49BgwZh5MiRpTQ8IiIiIqL3o/E3rQ0dOhRDhw4tjbEQEREREZW4YhdeuVyOEydO4PLly0hJSYG1tTXatGmD3r17QyaTleYYiYiIiIjeWbHm8L548QJeXl5YtmwZUlJSYGVlhcTERCxevBhDhw5FZmZmaY+TiIiIiOidFGsP77p162BmZoYLFy7A3NxctTw5ORl+fn7YvHkzPv/881IbJBERERHRuyrWHt7z589j8eLFamUXAKysrDBv3jycOXOmVAZHRFSepFIJ9PSkGv+TyfJfWmUyza+r/CeVSso5PRGReBRrD29KSgpq165d6GX16tVDYmJiiQ6KiKi8SaUSWFmZvlfxtLIyfefrKhQCkpPToVAI73wbRESUr1iFVyp9847gvLy8EhkMEdGHQiqVQCqV4FRMKhKz5GV63zZGevBwMINUKmHhJSIqARqfloyISJckZskRn8k39URE2qxYhTcrKwsjRowo8vLs7OwSGxARERERUUkqVuH19fV94+UtW7YskcEQEREREZW0YhXeKVOmlPY4iIiIiIhKRbFOS0ZEREREpK1YeImIiIhI1Fh4iYiIiEjUWHiJiIiISNSKddDaxo0b37oOD2wjIiIiog9RsQpvREQEgPzz8d64cQMNGjRA9erVER8fj7/++gtt2rQp1UESEREREb2rYhXe/fv3AwBmzZqF/v37Y8iQIarLTpw4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sG7dOnzzzTelNT4iIiIioveiUeE1NzeHkZER7O3tERUVBQBo1qwZnjx5UiqDIyIiIiJ6XxoV3tq1a+Pw4cMwNDSEiYkJbt++jXv37kEiefejt4mIiIiISpNGB635+/tj0qRJaNOmDcaMGYOBAwdCJpNhyJAhpTU+IiIiIqL3olHhbd68OX755Rfo6+tj0KBBqF+/PtLS0tCmTZvSGh8RERER0XvRaEpD3759YWhoCKk0/2pNmzZFmzZt0KlTp1IZHBERERHR+3rrHt5Hjx5h8+bNAIDo6GjMnj1b7fK0tDRkZWWVzuiIiIiIiN7TW/fw1qhRA1ZWVkVebm1tjXXr1pXooIiIiIiISkqx5vDOmDEDAGBvbw9fX99SHRARERERUUkq9hxehUKhdjaGy5cvY/fu3Xjw4EGpDIyIiIiIqCQUq/DGx8ejd+/e+L//+z8AwDfffINRo0bhm2++wYABA3Djxo1SHSQRERER0bsqVuFdt24d6tWrhy+++AIAsGHDBowfPx7Hjx/HggULsGHDhlIdJBERERHRuypW4f3tt98wb9482NjYIC4uDo8ePYKHhwcAoHPnzvjzzz9Lc4xERERERO+sWIU3LS0N1tbWAIC//voL5ubmqFOnDgDA0NAQubm5pTdCIiIiIqL3UKzCa2FhgaSkJABAZGQkmjdvrrrs/v37bzxtGRERERFReSpW4e3YsSOWLFmC8PBwfPPNN+jZsycA4OXLl1i/fj3c3d1LdZBERERERO+qWIX3s88+w4sXLzBnzhx07doVvXv3BgC0b98eUVFRmDp1aqkOkoiIiIjoXRXriyfMzc2xa9euAss3bNgAV1dXGBoalvjAiIiIiIhKQrEKb1Hatm1bUuMgIiIiIioVxf6mNSIiIiIibcTCS0RERESixsJLRERERKLGwktEREREosbCS0RERESixsJLRERERKLGwktEREREosbCS0RERESixsJLRERERKLGwktEREREosbCS0RERESixsJLRERERKLGwktEREREolYuhTcxMRG+vr5wcXGBm5sbgoKCIJfLC133woUL6N27N5o1a4bu3bvj3Llzqsuys7MRFBSEdu3aoUWLFhgwYAAuX75cVjGIiIiISAuUS+ENCAiAiYkJLl68iLCwMFy6dAl79uwpsF5MTAymTp0Kf39/XLlyBVOnTkVAQADi4+MBAKtX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REREosbCS0RERESixsJLRERERKLGwktEREREosbCS0RERESixsJLRERERKLGwktEREREosbCS0RERESixsJLRERERKLGwktEREREosbCS0RERESixsJLRERERKLGwktEREREosbCS0RERESixsJLRERERKLGwktEREREosbCS0RERESixsJLRERERKLGwktEREREosbCS0RERESixsJLRERERKLGwktEREREosbCS0RERESixsJLRERERKLGwktEREREosbCS0RERESixsJLRERERKLGwktEREREosbCS0RERESixsJLRERERKLGwktEREREosbCS0RERESixsJLRERERKLGwktEREREosbCS0RERESixsJLRERERKJWLoU3MTERvr6+cHFxgZubG4KCgiCXywtd98KFC+jduzeaNWuG7t2749y5c2qXb9++He3atUOzZs0wfPhw3L9/vywiEBEREZGWKJfCGxAQABMTE1y8eBFhYWG4dOkS9uzZU2C9mJgYTJ06Ff7+/rhy5QqmTp2KgIAAxMfHAwBOnDiB/fv3Y+fOnYiIiEDDhg3h5+cHQRDKOBERERERfajKvPA+fPgQkZGRmD59OoyNjWFvbw9fX18cPHiwwLonTpyAi4sLunTpAj09PfTo0QOurq4IDQ0FABw5cgTe3t5wdHSEoaEhpk2bhri4OERERJR1LCIiIiL6QOmV9R1GRUXB0tISdnZ2qmV16tRBXFwcXr58CXNzc9Xy6OhoODk5qV2/bt26uHPnjurycePGqS7T19eHg4MD7ty5g1atWhV7TBLJu6YBpFIJJO9xAzLZu7/nEAQBCkX57c22M9aDfhm/ZbI2/N9T9n222/tg7rLD3Mxd1pi77DA3cxdXSTxOZV5409PTYWxsrLZM+XNGRoZa4S1sXSMjI2RkZBTr8uKysTHTaP2SZGVlWm73/b561NTNx425yx5zlz3mLnvMXfaYu+yVV+4yn9JgYmKCzMxMtWXKn01N1R8EY2NjZGVlqS3LyspSrfe2y4mIiIiIyrzwOjo6IiUlBQkJCapl9+7dQ+XKlWFmpv6Ow8nJCVFRUWrLoqOj4ejoqLqtVy/Pzc1FTExMgWkQRERERKS7yrzwOjg4oEWLFli2bBnS0tIQGxuLkJAQeHl5FVjXw8MDkZGRCA8Ph1wuR3h4OCIjI9GnTx8AgKenJw4c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"
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "execution_count": 71
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-09-27T14:05:02.988120Z",
     "start_time": "2024-09-27T14:05:02.921935Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# 设置标准差的阈值（可以根据需要调整）\n",
    "threshold = 0.05\n",
    "# 找出标准差小于阈值的特征\n",
    "features_to_drop = std_devs[std_devs < threshold].index.tolist()\n",
    "# 剔除变化很小的特征\n",
    "df_reduced = df_Master.drop(columns=features_to_drop)\n",
    "\n",
    "# 打印结果\n",
    "print(\"剔除的特征:\")\n",
    "print(features_to_drop)\n",
    "print(\"\\n剔除后的 DataFrame:\")\n",
    "print(df_reduced)\n"
   ],
   "id": "7d3ee654cd1669b2",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "剔除的特征:\n",
      "['WeblogInfo_49', 'WeblogInfo_44', 'WeblogInfo_41', 'WeblogInfo_46', 'WeblogInfo_55', 'SocialNetwork_1', 'WeblogInfo_43', 'WeblogInfo_47']\n",
      "\n",
      "剔除后的 DataFrame:\n",
      "         Idx  UserInfo_1 UserInfo_2  UserInfo_3 UserInfo_4  WeblogInfo_2  \\\n",
      "0      10001         1.0         深圳         4.0         深圳           1.0   \n",
      "1      10002         1.0         温州         4.0         温州           0.0   \n",
      "2      10003         1.0         宜昌         3.0         宜昌           0.0   \n",
      "3      10006         4.0         南平         1.0         南平           0.0   \n",
      "4      10007         5.0         辽阳         1.0         辽阳           0.0   \n",
      "...      ...         ...        ...         ...        ...           ...   \n",
      "49994   9976         1.0       鄂尔多斯         5.0       鄂尔多斯           0.0   \n",
      "49995   9981         1.0         聊城         4.0         聊城           0.0   \n",
      "49996    999         1.0        秦皇岛         4.0        秦皇岛           0.0   \n",
      "49997   9993         4.0         广州         3.0         茂名           0.0   \n",
      "49998   9994         4.0         上海         5.0         常州           0.0   \n",
      "\n",
      "       WeblogInfo_4  WeblogInfo_5  WeblogInfo_6  WeblogInfo_7  ...  \\\n",
      "0               1.0           1.0           1.0            14  ...   \n",
      "1               1.0           1.0           1.0            14  ...   \n",
      "2               2.0           2.0           2.0             9  ...   \n",
      "3               2.0           1.0           2.0             2  ...   \n",
      "4               1.0           1.0           1.0             3  ...   \n",
      "...             ...           ...           ...           ...  ...   \n",
      "49994           2.0           1.0           2.0             5  ...   \n",
      "49995           2.0           1.0           2.0             2  ...   \n",
      "49996           2.0           1.0           2.0             0  ...   \n",
      "49997           3.0           3.0           3.0             5  ...   \n",
      "49998           1.0           1.0           1.0             4  ...   \n",
      "\n",
      "       SocialNetwork_11  SocialNetwork_12  SocialNetwork_13  SocialNetwork_14  \\\n",
      "0                    -1                 0                 0                 0   \n",
      "1                    -1                 0                 0                 0   \n",
      "2                    -1                -1                 1                 0   \n",
      "3                    -1                -1                 0                 0   \n",
      "4                    -1                -1                 0                 0   \n",
      "...                 ...               ...               ...               ...   \n",
      "49994                -1                -1                 0                 0   \n",
      "49995                -1                -1                 0                 0   \n",
      "49996                -1                -1                 0                 0   \n",
      "49997                -1                 0                 1                 1   \n",
      "49998                -1                -1                 0                 0   \n",
      "\n",
      "       SocialNetwork_15  SocialNetwork_16  SocialNetwork_17  target  \\\n",
      "0                     0                 0                 1     0.0   \n",
      "1                     0                 0                 2     0.0   \n",
      "2                     0                 0                 0     0.0   \n",
      "3                     0                 0                 0     0.0   \n",
      "4                     0                 0                 0     0.0   \n",
      "...                 ...               ...               ...     ...   \n",
      "49994                 0                 0                 0     0.0   \n",
      "49995                 0                 0                 0     0.0   \n",
      "49996                 0                 0                 0     0.0   \n",
      "49997                 0                 0                 1     0.0   \n",
      "49998                 0                 0                 0     0.0   \n",
      "\n",
      "       ListingInfo  sample_status  \n",
      "0         2014/3/5          train  \n",
      "1        2014/2/26          train  \n",
      "2        2014/2/28          train  \n",
      "3        2014/2/25          train  \n",
      "4        2014/2/27          train  \n",
      "...            ...            ...  \n",
      "49994    26/2/2014           test  \n",
      "49995    27/2/2014           test  \n",
      "49996   16/11/2013           test  \n",
      "49997    21/2/2014           test  \n",
      "49998    28/2/2014           test  \n",
      "\n",
      "[49999 rows x 219 columns]\n"
     ]
    }
   ],
   "execution_count": 72
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-09-27T14:05:03.010167Z",
     "start_time": "2024-09-27T14:05:02.989126Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# 表示省份的有\n",
    "# UserInfo_19和UserInfo_7\n",
    "# 表示城市的有\n",
    "# UserInfo_2,UserInfo_20,UserInfo_4,UserInfo_8\n",
    "city_feature = ['UserInfo_2','UserInfo_20','UserInfo_4','UserInfo_8']\n",
    "province_feature=['UserInfo_7','UserInfo_19']\n",
    "\n",
    "print(\"城市特征：\")\n",
    "for col in city_feature:\n",
    "    print(col,\":\",df_Master[col].nunique())\n",
    " \n",
    "print('\\n')\n",
    "print(\"省份特征：\")\n",
    "for col in province_feature:\n",
    "        print(col,\":\",df_Master[col].nunique())"
   ],
   "id": "5c8cf008ccc6b763",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "城市特征：\n",
      "UserInfo_2 : 330\n",
      "UserInfo_20 : 308\n",
      "UserInfo_4 : 333\n",
      "UserInfo_8 : 664\n",
      "\n",
      "\n",
      "省份特征：\n",
      "UserInfo_7 : 32\n",
      "UserInfo_19 : 31\n"
     ]
    }
   ],
   "execution_count": 73
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-09-27T14:05:03.044844Z",
     "start_time": "2024-09-27T14:05:03.011726Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# 去掉字段中的“市”，保持统一\n",
    "df_Master['UserInfo_20'] = [a[:-1] if a.find('市')!= -1 else a[:] for a in df_Master['UserInfo_8']]\n",
    "df_Master['UserInfo_20']"
   ],
   "id": "d3f733a9c9f912d3",
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\31838\\AppData\\Local\\Temp\\ipykernel_19720\\120576793.py:2: SettingWithCopyWarning: \n",
      "A value is trying to be set on a copy of a slice from a DataFrame.\n",
      "Try using .loc[row_indexer,col_indexer] = value instead\n",
      "\n",
      "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
      "  df_Master['UserInfo_20'] = [a[:-1] if a.find('市')!= -1 else a[:] for a in df_Master['UserInfo_8']]\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "0          深圳\n",
       "1          温州\n",
       "2          宜昌\n",
       "3          南平\n",
       "4          辽阳\n",
       "         ... \n",
       "49994    鄂尔多斯\n",
       "49995      聊城\n",
       "49996     秦皇岛\n",
       "49997      深圳\n",
       "49998      不详\n",
       "Name: UserInfo_20, Length: 49999, dtype: object"
      ]
     },
     "execution_count": 74,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 74
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-09-27T14:05:03.183980Z",
     "start_time": "2024-09-27T14:05:03.045853Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# 大小写进行统一\n",
    "# 显示了客户修改信息的日志\n",
    "df_Userupdate\n",
    "# 将上表的大小写进行统一\n",
    "df_Userupdate['UserupdateInfo1'] = df_Userupdate.UserupdateInfo1.map(lambda s:s.lower())\n",
    "df_Userupdate"
   ],
   "id": "5a4f7274348c6c7e",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "          Idx ListingInfo1    UserupdateInfo1 UserupdateInfo2\n",
       "0       10001   2014/03/05       _educationid      2014/02/20\n",
       "1       10001   2014/03/05         _hasbuycar      2014/02/20\n",
       "2       10001   2014/03/05    _lastupdatedate      2014/02/20\n",
       "3       10001   2014/03/05  _marriagestatusid      2014/02/20\n",
       "4       10001   2014/03/05       _mobilephone      2014/02/20\n",
       "...       ...          ...                ...             ...\n",
       "621290   9994   2014/02/28                _qq      2014/02/20\n",
       "621291   9994   2014/02/28  _residenceaddress      2014/02/20\n",
       "621292   9994   2014/02/28    _residencephone      2014/02/20\n",
       "621293   9994   2014/02/28   _residencetypeid      2014/02/20\n",
       "621294   9994   2014/02/28    _residenceyears      2014/02/20\n",
       "\n",
       "[621295 rows x 4 columns]"
      ],
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Idx</th>\n",
       "      <th>ListingInfo1</th>\n",
       "      <th>UserupdateInfo1</th>\n",
       "      <th>UserupdateInfo2</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>10001</td>\n",
       "      <td>2014/03/05</td>\n",
       "      <td>_educationid</td>\n",
       "      <td>2014/02/20</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>10001</td>\n",
       "      <td>2014/03/05</td>\n",
       "      <td>_hasbuycar</td>\n",
       "      <td>2014/02/20</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>10001</td>\n",
       "      <td>2014/03/05</td>\n",
       "      <td>_lastupdatedate</td>\n",
       "      <td>2014/02/20</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>10001</td>\n",
       "      <td>2014/03/05</td>\n",
       "      <td>_marriagestatusid</td>\n",
       "      <td>2014/02/20</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>10001</td>\n",
       "      <td>2014/03/05</td>\n",
       "      <td>_mobilephone</td>\n",
       "      <td>2014/02/20</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>621290</th>\n",
       "      <td>9994</td>\n",
       "      <td>2014/02/28</td>\n",
       "      <td>_qq</td>\n",
       "      <td>2014/02/20</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>621291</th>\n",
       "      <td>9994</td>\n",
       "      <td>2014/02/28</td>\n",
       "      <td>_residenceaddress</td>\n",
       "      <td>2014/02/20</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>621292</th>\n",
       "      <td>9994</td>\n",
       "      <td>2014/02/28</td>\n",
       "      <td>_residencephone</td>\n",
       "      <td>2014/02/20</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>621293</th>\n",
       "      <td>9994</td>\n",
       "      <td>2014/02/28</td>\n",
       "      <td>_residencetypeid</td>\n",
       "      <td>2014/02/20</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>621294</th>\n",
       "      <td>9994</td>\n",
       "      <td>2014/02/28</td>\n",
       "      <td>_residenceyears</td>\n",
       "      <td>2014/02/20</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>621295 rows × 4 columns</p>\n",
       "</div>"
      ]
     },
     "execution_count": 75,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 75
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-09-27T14:05:03.223666Z",
     "start_time": "2024-09-27T14:05:03.185989Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# 去除 UserInfo_9 列中的空格字符\n",
    "df_Master['UserInfo_9'] = df_Master['UserInfo_9'].str.strip()\n",
    "# 打印处理后的数据\n",
    "print(\"\\n处理后的数据:\")\n",
    "print(df_Master)"
   ],
   "id": "d5b65a581137137f",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "处理后的数据:\n",
      "         Idx  UserInfo_1 UserInfo_2  UserInfo_3 UserInfo_4  WeblogInfo_2  \\\n",
      "0      10001         1.0         深圳         4.0         深圳           1.0   \n",
      "1      10002         1.0         温州         4.0         温州           0.0   \n",
      "2      10003         1.0         宜昌         3.0         宜昌           0.0   \n",
      "3      10006         4.0         南平         1.0         南平           0.0   \n",
      "4      10007         5.0         辽阳         1.0         辽阳           0.0   \n",
      "...      ...         ...        ...         ...        ...           ...   \n",
      "49994   9976         1.0       鄂尔多斯         5.0       鄂尔多斯           0.0   \n",
      "49995   9981         1.0         聊城         4.0         聊城           0.0   \n",
      "49996    999         1.0        秦皇岛         4.0        秦皇岛           0.0   \n",
      "49997   9993         4.0         广州         3.0         茂名           0.0   \n",
      "49998   9994         4.0         上海         5.0         常州           0.0   \n",
      "\n",
      "       WeblogInfo_4  WeblogInfo_5  WeblogInfo_6  WeblogInfo_7  ...  \\\n",
      "0               1.0           1.0           1.0            14  ...   \n",
      "1               1.0           1.0           1.0            14  ...   \n",
      "2               2.0           2.0           2.0             9  ...   \n",
      "3               2.0           1.0           2.0             2  ...   \n",
      "4               1.0           1.0           1.0             3  ...   \n",
      "...             ...           ...           ...           ...  ...   \n",
      "49994           2.0           1.0           2.0             5  ...   \n",
      "49995           2.0           1.0           2.0             2  ...   \n",
      "49996           2.0           1.0           2.0             0  ...   \n",
      "49997           3.0           3.0           3.0             5  ...   \n",
      "49998           1.0           1.0           1.0             4  ...   \n",
      "\n",
      "       SocialNetwork_11  SocialNetwork_12  SocialNetwork_13  SocialNetwork_14  \\\n",
      "0                    -1                 0                 0                 0   \n",
      "1                    -1                 0                 0                 0   \n",
      "2                    -1                -1                 1                 0   \n",
      "3                    -1                -1                 0                 0   \n",
      "4                    -1                -1                 0                 0   \n",
      "...                 ...               ...               ...               ...   \n",
      "49994                -1                -1                 0                 0   \n",
      "49995                -1                -1                 0                 0   \n",
      "49996                -1                -1                 0                 0   \n",
      "49997                -1                 0                 1                 1   \n",
      "49998                -1                -1                 0                 0   \n",
      "\n",
      "       SocialNetwork_15  SocialNetwork_16  SocialNetwork_17  target  \\\n",
      "0                     0                 0                 1     0.0   \n",
      "1                     0                 0                 2     0.0   \n",
      "2                     0                 0                 0     0.0   \n",
      "3                     0                 0                 0     0.0   \n",
      "4                     0                 0                 0     0.0   \n",
      "...                 ...               ...               ...     ...   \n",
      "49994                 0                 0                 0     0.0   \n",
      "49995                 0                 0                 0     0.0   \n",
      "49996                 0                 0                 0     0.0   \n",
      "49997                 0                 0                 1     0.0   \n",
      "49998                 0                 0                 0     0.0   \n",
      "\n",
      "       ListingInfo  sample_status  \n",
      "0         2014/3/5          train  \n",
      "1        2014/2/26          train  \n",
      "2        2014/2/28          train  \n",
      "3        2014/2/25          train  \n",
      "4        2014/2/27          train  \n",
      "...            ...            ...  \n",
      "49994    26/2/2014           test  \n",
      "49995    27/2/2014           test  \n",
      "49996   16/11/2013           test  \n",
      "49997    21/2/2014           test  \n",
      "49998    28/2/2014           test  \n",
      "\n",
      "[49999 rows x 227 columns]\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\31838\\AppData\\Local\\Temp\\ipykernel_19720\\1703242756.py:2: SettingWithCopyWarning: \n",
      "A value is trying to be set on a copy of a slice from a DataFrame.\n",
      "Try using .loc[row_indexer,col_indexer] = value instead\n",
      "\n",
      "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
      "  df_Master['UserInfo_9'] = df_Master['UserInfo_9'].str.strip()\n"
     ]
    }
   ],
   "execution_count": 76
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-09-27T14:05:03.289110Z",
     "start_time": "2024-09-27T14:05:03.225670Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# 一线城市\n",
    "first_tier_cities = [\"北京\", \"上海\", \"广州\", \"深圳\"]\n",
    "\n",
    "# 新一线城市\n",
    "new_first_tier_cities = [\"杭州\", \"南京\", \"成都\", \"重庆\", \"武汉\", \"西安\", \"天津\", \"苏州\", \"郑州\", \"长沙\"]\n",
    "\n",
    "# 二线城市\n",
    "second_tier_cities = [\"青岛\", \"宁波\", \"济南\", \"厦门\", \"大连\", \"合肥\", \"福州\", \"南昌\", \"温州\", \"昆明\", \"哈尔滨\"]\n",
    "\n",
    "# 三线城市\n",
    "third_tier_cities = [\"常州\", \"南通\", \"石家庄\", \"唐山\", \"无锡\", \"温州\", \"绍兴\", \"徐州\", \"嘉兴\", \"贵阳\", \"南宁\"]\n",
    "def citycombine(a):\n",
    "    if a in first_tier_cities:\n",
    "        return '一线城市'\n",
    "    elif a in new_first_tier_cities:\n",
    "        return '新一线城市'\n",
    "    elif a in second_tier_cities:\n",
    "        return '二线城市'\n",
    "    elif a in third_tier_cities:\n",
    "        return '三线城市'\n",
    "    elif a =='0':\n",
    "        return '未知'\n",
    "    elif a =='不详':\n",
    "        return '未知'\n",
    "    else:\n",
    "        return '其他'\n",
    "df_Master['city_level'] = df_Master['UserInfo_2'].apply(lambda  x :citycombine(x))\n",
    "\n",
    "df_Master['UserInfo_2'].value_counts()\n"
   ],
   "id": "cbf85b0046d1ae59",
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\31838\\AppData\\Local\\Temp\\ipykernel_19720\\2973591532.py:27: SettingWithCopyWarning: \n",
      "A value is trying to be set on a copy of a slice from a DataFrame.\n",
      "Try using .loc[row_indexer,col_indexer] = value instead\n",
      "\n",
      "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
      "  df_Master['city_level'] = df_Master['UserInfo_2'].apply(lambda  x :citycombine(x))\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "UserInfo_2\n",
       "深圳             1245\n",
       "广州             1150\n",
       "上海             1061\n",
       "北京              928\n",
       "重庆              893\n",
       "               ... \n",
       "克孜勒苏柯尔克孜自治州       2\n",
       "昌都                2\n",
       "山南                1\n",
       "日喀则               1\n",
       "海南藏族自治州           1\n",
       "Name: count, Length: 330, dtype: int64"
      ]
     },
     "execution_count": 77,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 77
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-09-27T14:05:03.323274Z",
     "start_time": "2024-09-27T14:05:03.291814Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# grouped = df_Master[df_Master.target =='1']['target'].groupby(df_Master['UserInfo_7']).value_counts()\n",
    "# grouped.sort_values(ascending=True)\n",
    "def get_province_id(province_name):\n",
    "    if province_name == '不详':\n",
    "        return 0\n",
    "    elif province_name == '山东':\n",
    "        return 2\n",
    "    elif province_name == '江苏':\n",
    "        return 3\n",
    "    elif province_name == '浙江':\n",
    "        return 4\n",
    "    elif province_name == '四川':\n",
    "        return 5\n",
    "    elif province_name == '福建':\n",
    "        return 6\n",
    "    elif province_name == '湖南':\n",
    "        return 7\n",
    "    else:\n",
    "        return 8\n",
    "df_Master['province_id'] = df_Master['UserInfo_7'].apply(lambda x :get_province_id(x))\n",
    "df_Master['province_id']"
   ],
   "id": "f1d9978a89a68038",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0        8\n",
       "1        4\n",
       "2        8\n",
       "3        6\n",
       "4        8\n",
       "        ..\n",
       "49994    8\n",
       "49995    2\n",
       "49996    8\n",
       "49997    8\n",
       "49998    0\n",
       "Name: province_id, Length: 49999, dtype: int64"
      ]
     },
     "execution_count": 78,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 78
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-09-27T14:05:03.330842Z",
     "start_time": "2024-09-27T14:05:03.326571Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# #地区转为经纬度\n",
    "# from geopy.geocoders import Nominatim\n",
    "# from geopy.exc import GeocoderTimedOut\n",
    "# # 初始化 geolocator\n",
    "# geolocator = Nominatim(user_agent=\"geoapiExercises\")\n",
    "# \n",
    "# # 定义获取经纬度的函数\n",
    "# def get_lat_long(city):\n",
    "#     try:\n",
    "#         location = geolocator.geocode(f\"{city}, China\")\n",
    "#         if location:\n",
    "#             return location.latitude, location.longitude\n",
    "#         else:\n",
    "#             return None, None\n",
    "#     except GeocoderTimedOut:\n",
    "#         return get_lat_long(city)\n",
    "# \n",
    "# # 使用 apply 方法将函数应用到 City 列\n",
    "# df_Master['Latitude'], df_Master['Longitude'] = zip(*df_Master['UserInfo_4'].apply(get_lat_long))\n",
    "# \n",
    "# df_Master"
   ],
   "id": "984f83ed0edf51ce",
   "outputs": [],
   "execution_count": 79
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-09-27T14:05:03.636686Z",
     "start_time": "2024-09-27T14:05:03.331841Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# 借款时间处理\n",
    "grouped_date_1 = df_Master[df_Master.target ==1.0]['target'].groupby(df_Master['ListingInfo']).count().sort_values(ascending=False)\n",
    "grouped_date_2 = df_Master[df_Master.target ==0.0]['target'].groupby(df_Master['ListingInfo']).count().sort_values(ascending=False)\n",
    "plt.figure()\n",
    "plt.title('date')\n",
    "grouped_date_1.plot(color='r')\n",
    "grouped_date_2.plot(color='b')\n",
    "plt.show()"
   ],
   "id": "286a818f56439213",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ],
      "image/png": "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"
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "execution_count": 80
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-09-27T14:05:03.748021Z",
     "start_time": "2024-09-27T14:05:03.637691Z"
    }
   },
   "cell_type": "code",
   "source": [
    "df_Master['month'] = pd.DatetimeIndex(df_Master.ListingInfo).month\n",
    "df_Master['day'] = pd.DatetimeIndex(df_Master.ListingInfo).day\n"
   ],
   "id": "d01d06fefb17f163",
   "outputs": [],
   "execution_count": 81
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-09-27T14:05:03.913417Z",
     "start_time": "2024-09-27T14:05:03.749028Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# from collections import defaultdict\n",
    "# userdate_info_number = defaultdict(list) #用户信息更新的次数\n",
    "# userdate_info_category = defaultdict(set) #用户信息更新的种类数\n",
    "# userdate_info_times = defaultdict(list)  #用户分几次更新了\n",
    "# userdate_info_date = defaultdict(list)  #用户借款成交域信息更新时间跨度\n",
    "# # 转换时间格式\n",
    "df_Userupdate['UserupdateInfo2'] = pd.to_datetime(df_Userupdate['UserupdateInfo2'])\n",
    "df_Userupdate['ListingInfo1'] = pd.to_datetime(df_Userupdate['ListingInfo1'])\n",
    "# # 1. 用户信息更新的次数\n",
    "# update_count = df_Userupdate.shape[0]\n",
    "# \n",
    "# # 2. 用户信息更新的种类数\n",
    "# update_types = df_Userupdate['UserupdateInfo1'].nunique()\n",
    "# \n",
    "# # 3. 用户分几次更新了\n",
    "# # 假设每条记录代表一次更新\n",
    "# update_sessions = df_Userupdate.groupby('ListingInfo1').size().count()\n",
    "# \n",
    "# # 4. 用户借款成交域信息更新时间跨度\n",
    "# time_span = df_Userupdate['UserupdateInfo2'].max() - df_Userupdate['UserupdateInfo2'].min()\n",
    "# \n",
    "# df_Userupdate['time'] = time_span\n",
    "# # 输出结果\n",
    "# print(f\"用户信息更新的次数: {update_count}\")\n",
    "# print(f\"用户信息更新的种类数: {update_types}\")\n",
    "# print(f\"用户分几次更新了: {update_sessions}\")\n",
    "# print(f\"用户借款成交域信息更新时间跨度: {time_span}\")"
   ],
   "id": "11ce1c3bf42494f9",
   "outputs": [],
   "execution_count": 82
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-09-27T14:05:11.235939Z",
     "start_time": "2024-09-27T14:05:03.914454Z"
    }
   },
   "cell_type": "code",
   "source": [
    "user_stats = df_Userupdate.groupby('Idx').agg(\n",
    "    update_count=('UserupdateInfo1', 'size'),             # 每个用户信息更新的次数\n",
    "    update_types=('UserupdateInfo1', 'nunique'),         # 每个用户信息更新的种类数\n",
    "    update_sessions=('ListingInfo1', 'nunique'),         # 每个用户分几次更新\n",
    "    time_span=('UserupdateInfo2', lambda x: x.max() - x.min())  # 更新时间跨度\n",
    ").reset_index()\n",
    "\n",
    "df_Userupdate = pd.merge(user_stats,df_Userupdate,on=\"Idx\",how='inner')\n",
    "df_Userupdate"
   ],
   "id": "7c9c4e95a9a47c6e",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "          Idx  update_count  update_types  update_sessions time_span  \\\n",
       "0           3            13            11                1    0 days   \n",
       "1           3            13            11                1    0 days   \n",
       "2           3            13            11                1    0 days   \n",
       "3           3            13            11                1    0 days   \n",
       "4           3            13            11                1    0 days   \n",
       "...       ...           ...           ...              ...       ...   \n",
       "621290  91704            11            11                1    0 days   \n",
       "621291  91704            11            11                1    0 days   \n",
       "621292  91704            11            11                1    0 days   \n",
       "621293  91704            11            11                1    0 days   \n",
       "621294  91704            11            11                1    0 days   \n",
       "\n",
       "       ListingInfo1    UserupdateInfo1 UserupdateInfo2  \n",
       "0        2013-11-05       _educationid      2013-08-30  \n",
       "1        2013-11-05         _hasbuycar      2013-08-30  \n",
       "2        2013-11-05          _idnumber      2013-08-30  \n",
       "3        2013-11-05    _lastupdatedate      2013-08-30  \n",
       "4        2013-11-05  _marriagestatusid      2013-08-30  \n",
       "...             ...                ...             ...  \n",
       "621290   2014-11-04                _qq      2014-10-26  \n",
       "621291   2014-11-04  _residenceaddress      2014-10-26  \n",
       "621292   2014-11-04    _residencephone      2014-10-26  \n",
       "621293   2014-11-04   _residencetypeid      2014-10-26  \n",
       "621294   2014-11-04    _residenceyears      2014-10-26  \n",
       "\n",
       "[621295 rows x 8 columns]"
      ],
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Idx</th>\n",
       "      <th>update_count</th>\n",
       "      <th>update_types</th>\n",
       "      <th>update_sessions</th>\n",
       "      <th>time_span</th>\n",
       "      <th>ListingInfo1</th>\n",
       "      <th>UserupdateInfo1</th>\n",
       "      <th>UserupdateInfo2</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>3</td>\n",
       "      <td>13</td>\n",
       "      <td>11</td>\n",
       "      <td>1</td>\n",
       "      <td>0 days</td>\n",
       "      <td>2013-11-05</td>\n",
       "      <td>_educationid</td>\n",
       "      <td>2013-08-30</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>3</td>\n",
       "      <td>13</td>\n",
       "      <td>11</td>\n",
       "      <td>1</td>\n",
       "      <td>0 days</td>\n",
       "      <td>2013-11-05</td>\n",
       "      <td>_hasbuycar</td>\n",
       "      <td>2013-08-30</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>3</td>\n",
       "      <td>13</td>\n",
       "      <td>11</td>\n",
       "      <td>1</td>\n",
       "      <td>0 days</td>\n",
       "      <td>2013-11-05</td>\n",
       "      <td>_idnumber</td>\n",
       "      <td>2013-08-30</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>3</td>\n",
       "      <td>13</td>\n",
       "      <td>11</td>\n",
       "      <td>1</td>\n",
       "      <td>0 days</td>\n",
       "      <td>2013-11-05</td>\n",
       "      <td>_lastupdatedate</td>\n",
       "      <td>2013-08-30</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>3</td>\n",
       "      <td>13</td>\n",
       "      <td>11</td>\n",
       "      <td>1</td>\n",
       "      <td>0 days</td>\n",
       "      <td>2013-11-05</td>\n",
       "      <td>_marriagestatusid</td>\n",
       "      <td>2013-08-30</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>621290</th>\n",
       "      <td>91704</td>\n",
       "      <td>11</td>\n",
       "      <td>11</td>\n",
       "      <td>1</td>\n",
       "      <td>0 days</td>\n",
       "      <td>2014-11-04</td>\n",
       "      <td>_qq</td>\n",
       "      <td>2014-10-26</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>621291</th>\n",
       "      <td>91704</td>\n",
       "      <td>11</td>\n",
       "      <td>11</td>\n",
       "      <td>1</td>\n",
       "      <td>0 days</td>\n",
       "      <td>2014-11-04</td>\n",
       "      <td>_residenceaddress</td>\n",
       "      <td>2014-10-26</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>621292</th>\n",
       "      <td>91704</td>\n",
       "      <td>11</td>\n",
       "      <td>11</td>\n",
       "      <td>1</td>\n",
       "      <td>0 days</td>\n",
       "      <td>2014-11-04</td>\n",
       "      <td>_residencephone</td>\n",
       "      <td>2014-10-26</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>621293</th>\n",
       "      <td>91704</td>\n",
       "      <td>11</td>\n",
       "      <td>11</td>\n",
       "      <td>1</td>\n",
       "      <td>0 days</td>\n",
       "      <td>2014-11-04</td>\n",
       "      <td>_residencetypeid</td>\n",
       "      <td>2014-10-26</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>621294</th>\n",
       "      <td>91704</td>\n",
       "      <td>11</td>\n",
       "      <td>11</td>\n",
       "      <td>1</td>\n",
       "      <td>0 days</td>\n",
       "      <td>2014-11-04</td>\n",
       "      <td>_residenceyears</td>\n",
       "      <td>2014-10-26</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>621295 rows × 8 columns</p>\n",
       "</div>"
      ]
     },
     "execution_count": 83,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 83
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-09-27T14:05:12.211724Z",
     "start_time": "2024-09-27T14:05:11.236943Z"
    }
   },
   "cell_type": "code",
   "source": [
    "df_Userupdate['update_date'] = df_Userupdate['UserupdateInfo2'].dt.date\n",
    "df_Userupdate['update_hour'] = df_Userupdate['UserupdateInfo2'].dt.hour\n",
    "df_Userupdate['update_day_of_week'] = df_Userupdate['UserupdateInfo2'].dt.day_name()\n",
    "df_Userupdate['listing_month'] = df_Userupdate['ListingInfo1'].dt.month\n",
    "df_Userupdate['time_diff'] = (df_Userupdate['UserupdateInfo2'] - df_Userupdate['ListingInfo1']).dt.days\n",
    "df_Userupdate['content_count'] = df_Userupdate.groupby('UserupdateInfo1')['UserupdateInfo1'].transform('count')"
   ],
   "id": "baf20b4be08429b8",
   "outputs": [],
   "execution_count": 84
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-09-27T14:05:12.227520Z",
     "start_time": "2024-09-27T14:05:12.213743Z"
    }
   },
   "cell_type": "code",
   "source": "df_LogInfo",
   "id": "e04be51b06a4be28",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "          Idx Listinginfo1  LogInfo1  LogInfo2    LogInfo3\n",
       "0       10001   2014-03-05       107         6  2014-02-20\n",
       "1       10001   2014-03-05       107         6  2014-02-23\n",
       "2       10001   2014-03-05       107         6  2014-02-24\n",
       "3       10001   2014-03-05       107         6  2014-02-25\n",
       "4       10001   2014-03-05       107         6  2014-02-27\n",
       "...       ...          ...       ...       ...         ...\n",
       "966426   9994   2014-02-28         2        21  2014-02-28\n",
       "966427   9994   2014-02-28         4         1  2014-02-20\n",
       "966428   9994   2014-02-28        -4         6  2014-02-20\n",
       "966429   9994   2014-02-28        -4         6  2014-02-20\n",
       "966430   9994   2014-02-28        -4         6  2014-02-20\n",
       "\n",
       "[966431 rows x 5 columns]"
      ],
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Idx</th>\n",
       "      <th>Listinginfo1</th>\n",
       "      <th>LogInfo1</th>\n",
       "      <th>LogInfo2</th>\n",
       "      <th>LogInfo3</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>10001</td>\n",
       "      <td>2014-03-05</td>\n",
       "      <td>107</td>\n",
       "      <td>6</td>\n",
       "      <td>2014-02-20</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>10001</td>\n",
       "      <td>2014-03-05</td>\n",
       "      <td>107</td>\n",
       "      <td>6</td>\n",
       "      <td>2014-02-23</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>10001</td>\n",
       "      <td>2014-03-05</td>\n",
       "      <td>107</td>\n",
       "      <td>6</td>\n",
       "      <td>2014-02-24</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>10001</td>\n",
       "      <td>2014-03-05</td>\n",
       "      <td>107</td>\n",
       "      <td>6</td>\n",
       "      <td>2014-02-25</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>10001</td>\n",
       "      <td>2014-03-05</td>\n",
       "      <td>107</td>\n",
       "      <td>6</td>\n",
       "      <td>2014-02-27</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>966426</th>\n",
       "      <td>9994</td>\n",
       "      <td>2014-02-28</td>\n",
       "      <td>2</td>\n",
       "      <td>21</td>\n",
       "      <td>2014-02-28</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>966427</th>\n",
       "      <td>9994</td>\n",
       "      <td>2014-02-28</td>\n",
       "      <td>4</td>\n",
       "      <td>1</td>\n",
       "      <td>2014-02-20</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>966428</th>\n",
       "      <td>9994</td>\n",
       "      <td>2014-02-28</td>\n",
       "      <td>-4</td>\n",
       "      <td>6</td>\n",
       "      <td>2014-02-20</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>966429</th>\n",
       "      <td>9994</td>\n",
       "      <td>2014-02-28</td>\n",
       "      <td>-4</td>\n",
       "      <td>6</td>\n",
       "      <td>2014-02-20</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>966430</th>\n",
       "      <td>9994</td>\n",
       "      <td>2014-02-28</td>\n",
       "      <td>-4</td>\n",
       "      <td>6</td>\n",
       "      <td>2014-02-20</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>966431 rows × 5 columns</p>\n",
       "</div>"
      ]
     },
     "execution_count": 85,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 85
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-09-27T14:05:15.890878Z",
     "start_time": "2024-09-27T14:05:12.229957Z"
    }
   },
   "cell_type": "code",
   "source": [
    "df_LogInfo['LogInfo3'] = pd.to_datetime(df_LogInfo['LogInfo3'])\n",
    "df_LogInfo['ListingInfo'] = pd.to_datetime(df_LogInfo['Listinginfo1'])\n",
    "df_LogInfo['login_date'] = df_LogInfo['LogInfo3'].dt.date  # 登录日期\n",
    "df_LogInfo['login_hour'] = df_LogInfo['LogInfo3'].dt.hour  # 登录小时\n",
    "df_LogInfo['login_day_of_week'] = df_LogInfo['LogInfo3'].dt.day_name()  # 登录星期几\n",
    "df_LogInfo['listing_month'] = df_LogInfo['ListingInfo'].dt.month  # 借款成交月份\n",
    "df_LogInfo['time_since_listing'] = (df_LogInfo['LogInfo3'] - df_LogInfo['ListingInfo']).dt.days  # 从借款成交到登录的天数\n",
    "df_LogInfo['is_login'] = df_LogInfo['LogInfo2'].apply(lambda x: 1 if x == '登录' else 0)  # 是否登录\n",
    "df_LogInfo['is_logout'] = df_LogInfo['LogInfo2'].apply(lambda x: 1 if x == '登出' else 0)  # 是否登出\n",
    "df_LogInfo['is_info_update'] = df_LogInfo['LogInfo2'].apply(lambda x: 1 if x == '修改信息' else 0)  # 是否修改信息\n",
    "df_LogInfo['total_actions'] = df_LogInfo.groupby('Idx')['LogInfo2'].transform('count')  # 总操作次数\n",
    "df_LogInfo['first_login'] = df_LogInfo.groupby('Idx')['LogInfo3'].transform('min')  # 第一次登录时间\n",
    "df_LogInfo['last_login'] = df_LogInfo.groupby('Idx')['LogInfo3'].transform('max')  # 最后一次登录时间\n",
    "df_LogInfo['login_duration'] = (df_LogInfo['last_login'] - df_LogInfo['first_login']).dt.total_seconds() / 3600  # 登录持续时间（小时）\n",
    "df_LogInfo['logins_per_day'] = df_LogInfo.groupby(['Idx', df_LogInfo['LogInfo3'].dt.date])['LogInfo2'].transform('count')  # 每日登录次数\n",
    "df_LogInfo['login_time_interval'] = df_LogInfo['LogInfo3'].diff().dt.total_seconds().fillna(0) / 60  # 两次登录间隔（分钟）\n",
    "df_LogInfo['login_hour_block'] = df_LogInfo['login_hour'].apply(lambda x: f\"{x // 4 * 4}:00-{x // 4 * 4 + 4}:00\")  # 登录时间区间\n",
    "df_LogInfo['weekend_login'] = df_LogInfo['login_day_of_week'].apply(lambda x: 1 if x in ['Saturday', 'Sunday'] else 0)  # 是否周末登录\n",
    "df_LogInfo['listing_year'] = df_LogInfo['ListingInfo'].dt.year  # 借款成交年份\n",
    "df_LogInfo['login_month'] = df_LogInfo['LogInfo3'].dt.month  # 登录月份\n",
    "df_LogInfo['login_second'] = df_LogInfo['LogInfo3'].dt.second  # 登录秒数"
   ],
   "id": "5d86fabbbfe371eb",
   "outputs": [],
   "execution_count": 86
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-09-27T14:05:16.468990Z",
     "start_time": "2024-09-27T14:05:15.891879Z"
    }
   },
   "cell_type": "code",
   "source": "df_LogInfo",
   "id": "be63fcc473ccd207",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "          Idx Listinginfo1  LogInfo1  LogInfo2   LogInfo3 ListingInfo  \\\n",
       "0       10001   2014-03-05       107         6 2014-02-20  2014-03-05   \n",
       "1       10001   2014-03-05       107         6 2014-02-23  2014-03-05   \n",
       "2       10001   2014-03-05       107         6 2014-02-24  2014-03-05   \n",
       "3       10001   2014-03-05       107         6 2014-02-25  2014-03-05   \n",
       "4       10001   2014-03-05       107         6 2014-02-27  2014-03-05   \n",
       "...       ...          ...       ...       ...        ...         ...   \n",
       "966426   9994   2014-02-28         2        21 2014-02-28  2014-02-28   \n",
       "966427   9994   2014-02-28         4         1 2014-02-20  2014-02-28   \n",
       "966428   9994   2014-02-28        -4         6 2014-02-20  2014-02-28   \n",
       "966429   9994   2014-02-28        -4         6 2014-02-20  2014-02-28   \n",
       "966430   9994   2014-02-28        -4         6 2014-02-20  2014-02-28   \n",
       "\n",
       "        login_date  login_hour login_day_of_week  listing_month  ...  \\\n",
       "0       2014-02-20           0          Thursday              3  ...   \n",
       "1       2014-02-23           0            Sunday              3  ...   \n",
       "2       2014-02-24           0            Monday              3  ...   \n",
       "3       2014-02-25           0           Tuesday              3  ...   \n",
       "4       2014-02-27           0          Thursday              3  ...   \n",
       "...            ...         ...               ...            ...  ...   \n",
       "966426  2014-02-28           0            Friday              2  ...   \n",
       "966427  2014-02-20           0          Thursday              2  ...   \n",
       "966428  2014-02-20           0          Thursday              2  ...   \n",
       "966429  2014-02-20           0          Thursday              2  ...   \n",
       "966430  2014-02-20           0          Thursday              2  ...   \n",
       "\n",
       "        first_login  last_login  login_duration  logins_per_day  \\\n",
       "0        2014-02-20  2014-03-04           288.0               9   \n",
       "1        2014-02-20  2014-03-04           288.0               2   \n",
       "2        2014-02-20  2014-03-04           288.0               2   \n",
       "3        2014-02-20  2014-03-04           288.0               2   \n",
       "4        2014-02-20  2014-03-04           288.0               2   \n",
       "...             ...         ...             ...             ...   \n",
       "966426   2014-02-20  2014-02-28           192.0               1   \n",
       "966427   2014-02-20  2014-02-28           192.0               9   \n",
       "966428   2014-02-20  2014-02-28           192.0               9   \n",
       "966429   2014-02-20  2014-02-28           192.0               9   \n",
       "966430   2014-02-20  2014-02-28           192.0               9   \n",
       "\n",
       "        login_time_interval login_hour_block weekend_login  listing_year  \\\n",
       "0                       0.0        0:00-4:00             0          2014   \n",
       "1                    4320.0        0:00-4:00             1          2014   \n",
       "2                    1440.0        0:00-4:00             0          2014   \n",
       "3                    1440.0        0:00-4:00             0          2014   \n",
       "4                    2880.0        0:00-4:00             0          2014   \n",
       "...                     ...              ...           ...           ...   \n",
       "966426              11520.0        0:00-4:00             0          2014   \n",
       "966427             -11520.0        0:00-4:00             0          2014   \n",
       "966428                  0.0        0:00-4:00             0          2014   \n",
       "966429                  0.0        0:00-4:00             0          2014   \n",
       "966430                  0.0        0:00-4:00             0          2014   \n",
       "\n",
       "        login_month  login_second  \n",
       "0                 2             0  \n",
       "1                 2             0  \n",
       "2                 2             0  \n",
       "3                 2             0  \n",
       "4                 2             0  \n",
       "...             ...           ...  \n",
       "966426            2             0  \n",
       "966427            2             0  \n",
       "966428            2             0  \n",
       "966429            2             0  \n",
       "966430            2             0  \n",
       "\n",
       "[966431 rows x 25 columns]"
      ],
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Idx</th>\n",
       "      <th>Listinginfo1</th>\n",
       "      <th>LogInfo1</th>\n",
       "      <th>LogInfo2</th>\n",
       "      <th>LogInfo3</th>\n",
       "      <th>ListingInfo</th>\n",
       "      <th>login_date</th>\n",
       "      <th>login_hour</th>\n",
       "      <th>login_day_of_week</th>\n",
       "      <th>listing_month</th>\n",
       "      <th>...</th>\n",
       "      <th>first_login</th>\n",
       "      <th>last_login</th>\n",
       "      <th>login_duration</th>\n",
       "      <th>logins_per_day</th>\n",
       "      <th>login_time_interval</th>\n",
       "      <th>login_hour_block</th>\n",
       "      <th>weekend_login</th>\n",
       "      <th>listing_year</th>\n",
       "      <th>login_month</th>\n",
       "      <th>login_second</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>10001</td>\n",
       "      <td>2014-03-05</td>\n",
       "      <td>107</td>\n",
       "      <td>6</td>\n",
       "      <td>2014-02-20</td>\n",
       "      <td>2014-03-05</td>\n",
       "      <td>2014-02-20</td>\n",
       "      <td>0</td>\n",
       "      <td>Thursday</td>\n",
       "      <td>3</td>\n",
       "      <td>...</td>\n",
       "      <td>2014-02-20</td>\n",
       "      <td>2014-03-04</td>\n",
       "      <td>288.0</td>\n",
       "      <td>9</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0:00-4:00</td>\n",
       "      <td>0</td>\n",
       "      <td>2014</td>\n",
       "      <td>2</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>10001</td>\n",
       "      <td>2014-03-05</td>\n",
       "      <td>107</td>\n",
       "      <td>6</td>\n",
       "      <td>2014-02-23</td>\n",
       "      <td>2014-03-05</td>\n",
       "      <td>2014-02-23</td>\n",
       "      <td>0</td>\n",
       "      <td>Sunday</td>\n",
       "      <td>3</td>\n",
       "      <td>...</td>\n",
       "      <td>2014-02-20</td>\n",
       "      <td>2014-03-04</td>\n",
       "      <td>288.0</td>\n",
       "      <td>2</td>\n",
       "      <td>4320.0</td>\n",
       "      <td>0:00-4:00</td>\n",
       "      <td>1</td>\n",
       "      <td>2014</td>\n",
       "      <td>2</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>10001</td>\n",
       "      <td>2014-03-05</td>\n",
       "      <td>107</td>\n",
       "      <td>6</td>\n",
       "      <td>2014-02-24</td>\n",
       "      <td>2014-03-05</td>\n",
       "      <td>2014-02-24</td>\n",
       "      <td>0</td>\n",
       "      <td>Monday</td>\n",
       "      <td>3</td>\n",
       "      <td>...</td>\n",
       "      <td>2014-02-20</td>\n",
       "      <td>2014-03-04</td>\n",
       "      <td>288.0</td>\n",
       "      <td>2</td>\n",
       "      <td>1440.0</td>\n",
       "      <td>0:00-4:00</td>\n",
       "      <td>0</td>\n",
       "      <td>2014</td>\n",
       "      <td>2</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>10001</td>\n",
       "      <td>2014-03-05</td>\n",
       "      <td>107</td>\n",
       "      <td>6</td>\n",
       "      <td>2014-02-25</td>\n",
       "      <td>2014-03-05</td>\n",
       "      <td>2014-02-25</td>\n",
       "      <td>0</td>\n",
       "      <td>Tuesday</td>\n",
       "      <td>3</td>\n",
       "      <td>...</td>\n",
       "      <td>2014-02-20</td>\n",
       "      <td>2014-03-04</td>\n",
       "      <td>288.0</td>\n",
       "      <td>2</td>\n",
       "      <td>1440.0</td>\n",
       "      <td>0:00-4:00</td>\n",
       "      <td>0</td>\n",
       "      <td>2014</td>\n",
       "      <td>2</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>10001</td>\n",
       "      <td>2014-03-05</td>\n",
       "      <td>107</td>\n",
       "      <td>6</td>\n",
       "      <td>2014-02-27</td>\n",
       "      <td>2014-03-05</td>\n",
       "      <td>2014-02-27</td>\n",
       "      <td>0</td>\n",
       "      <td>Thursday</td>\n",
       "      <td>3</td>\n",
       "      <td>...</td>\n",
       "      <td>2014-02-20</td>\n",
       "      <td>2014-03-04</td>\n",
       "      <td>288.0</td>\n",
       "      <td>2</td>\n",
       "      <td>2880.0</td>\n",
       "      <td>0:00-4:00</td>\n",
       "      <td>0</td>\n",
       "      <td>2014</td>\n",
       "      <td>2</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>966426</th>\n",
       "      <td>9994</td>\n",
       "      <td>2014-02-28</td>\n",
       "      <td>2</td>\n",
       "      <td>21</td>\n",
       "      <td>2014-02-28</td>\n",
       "      <td>2014-02-28</td>\n",
       "      <td>2014-02-28</td>\n",
       "      <td>0</td>\n",
       "      <td>Friday</td>\n",
       "      <td>2</td>\n",
       "      <td>...</td>\n",
       "      <td>2014-02-20</td>\n",
       "      <td>2014-02-28</td>\n",
       "      <td>192.0</td>\n",
       "      <td>1</td>\n",
       "      <td>11520.0</td>\n",
       "      <td>0:00-4:00</td>\n",
       "      <td>0</td>\n",
       "      <td>2014</td>\n",
       "      <td>2</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>966427</th>\n",
       "      <td>9994</td>\n",
       "      <td>2014-02-28</td>\n",
       "      <td>4</td>\n",
       "      <td>1</td>\n",
       "      <td>2014-02-20</td>\n",
       "      <td>2014-02-28</td>\n",
       "      <td>2014-02-20</td>\n",
       "      <td>0</td>\n",
       "      <td>Thursday</td>\n",
       "      <td>2</td>\n",
       "      <td>...</td>\n",
       "      <td>2014-02-20</td>\n",
       "      <td>2014-02-28</td>\n",
       "      <td>192.0</td>\n",
       "      <td>9</td>\n",
       "      <td>-11520.0</td>\n",
       "      <td>0:00-4:00</td>\n",
       "      <td>0</td>\n",
       "      <td>2014</td>\n",
       "      <td>2</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>966428</th>\n",
       "      <td>9994</td>\n",
       "      <td>2014-02-28</td>\n",
       "      <td>-4</td>\n",
       "      <td>6</td>\n",
       "      <td>2014-02-20</td>\n",
       "      <td>2014-02-28</td>\n",
       "      <td>2014-02-20</td>\n",
       "      <td>0</td>\n",
       "      <td>Thursday</td>\n",
       "      <td>2</td>\n",
       "      <td>...</td>\n",
       "      <td>2014-02-20</td>\n",
       "      <td>2014-02-28</td>\n",
       "      <td>192.0</td>\n",
       "      <td>9</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0:00-4:00</td>\n",
       "      <td>0</td>\n",
       "      <td>2014</td>\n",
       "      <td>2</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>966429</th>\n",
       "      <td>9994</td>\n",
       "      <td>2014-02-28</td>\n",
       "      <td>-4</td>\n",
       "      <td>6</td>\n",
       "      <td>2014-02-20</td>\n",
       "      <td>2014-02-28</td>\n",
       "      <td>2014-02-20</td>\n",
       "      <td>0</td>\n",
       "      <td>Thursday</td>\n",
       "      <td>2</td>\n",
       "      <td>...</td>\n",
       "      <td>2014-02-20</td>\n",
       "      <td>2014-02-28</td>\n",
       "      <td>192.0</td>\n",
       "      <td>9</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0:00-4:00</td>\n",
       "      <td>0</td>\n",
       "      <td>2014</td>\n",
       "      <td>2</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>966430</th>\n",
       "      <td>9994</td>\n",
       "      <td>2014-02-28</td>\n",
       "      <td>-4</td>\n",
       "      <td>6</td>\n",
       "      <td>2014-02-20</td>\n",
       "      <td>2014-02-28</td>\n",
       "      <td>2014-02-20</td>\n",
       "      <td>0</td>\n",
       "      <td>Thursday</td>\n",
       "      <td>2</td>\n",
       "      <td>...</td>\n",
       "      <td>2014-02-20</td>\n",
       "      <td>2014-02-28</td>\n",
       "      <td>192.0</td>\n",
       "      <td>9</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0:00-4:00</td>\n",
       "      <td>0</td>\n",
       "      <td>2014</td>\n",
       "      <td>2</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>966431 rows × 25 columns</p>\n",
       "</div>"
      ]
     },
     "execution_count": 87,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 87
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-09-27T14:05:16.473345Z",
     "start_time": "2024-09-27T14:05:16.469995Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# # 1)省份特征————————推测可能一个是籍贯省份，一个是居住省份\n",
    "# # 首先看看各省份好坏样本的分布占比\n",
    "# def get_badrate(df,col):\n",
    "#     '''\n",
    "#     根据某个变量计算违约率\n",
    "#     '''\n",
    "#     group = df.groupby(col)\n",
    "#     df=pd.DataFrame()\n",
    "#     df['total'] = group.target.count()\n",
    "#     df['bad'] = group.target.sum()\n",
    "#     df['badrate'] = round(df['bad']/df['total'],4)*100  # 百分比形式\n",
    "#     return df.sort_values('badrate',ascending=False)\n",
    "#  \n",
    "# # 户籍省份的违约率计算\n",
    "# province_original = get_badrate(df_Master,'UserInfo_19')\n",
    "# province_original\n",
    "# # 居住地省份的违约率计算\n",
    "# province_current = get_badrate(df_Master,'UserInfo_7')\n",
    "# province_current "
   ],
   "id": "59988c3ce07875a",
   "outputs": [],
   "execution_count": 88
  },
  {
   "cell_type": "code",
   "id": "aa4061901a3331f9",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-09-27T14:05:38.308040Z",
     "start_time": "2024-09-27T14:05:16.474349Z"
    }
   },
   "source": [
    "df_final =  pd.merge(df_Master, df_LogInfo, on='Idx', how='left')\n",
    "df_final  =  pd.merge(df_final, df_Userupdate, on='Idx',how='left')"
   ],
   "outputs": [
    {
     "ename": "MemoryError",
     "evalue": "Unable to allocate 17.1 GiB for an array with shape (170, 13478955) and data type int64",
     "output_type": "error",
     "traceback": [
      "\u001B[1;31m---------------------------------------------------------------------------\u001B[0m",
      "\u001B[1;31mMemoryError\u001B[0m                               Traceback (most recent call last)",
      "Cell \u001B[1;32mIn[89], line 2\u001B[0m\n\u001B[0;32m      1\u001B[0m df_final \u001B[38;5;241m=\u001B[39m  pd\u001B[38;5;241m.\u001B[39mmerge(df_Master, df_LogInfo, on\u001B[38;5;241m=\u001B[39m\u001B[38;5;124m'\u001B[39m\u001B[38;5;124mIdx\u001B[39m\u001B[38;5;124m'\u001B[39m, how\u001B[38;5;241m=\u001B[39m\u001B[38;5;124m'\u001B[39m\u001B[38;5;124mleft\u001B[39m\u001B[38;5;124m'\u001B[39m)\n\u001B[1;32m----> 2\u001B[0m df_final  \u001B[38;5;241m=\u001B[39m  pd\u001B[38;5;241m.\u001B[39mmerge(df_final, df_Userupdate, on\u001B[38;5;241m=\u001B[39m\u001B[38;5;124m'\u001B[39m\u001B[38;5;124mIdx\u001B[39m\u001B[38;5;124m'\u001B[39m,how\u001B[38;5;241m=\u001B[39m\u001B[38;5;124m'\u001B[39m\u001B[38;5;124mleft\u001B[39m\u001B[38;5;124m'\u001B[39m)\n",
      "File \u001B[1;32mD:\\Anaconda\\Lib\\site-packages\\pandas\\core\\reshape\\merge.py:183\u001B[0m, in \u001B[0;36mmerge\u001B[1;34m(left, right, how, on, left_on, right_on, left_index, right_index, sort, suffixes, copy, indicator, validate)\u001B[0m\n\u001B[0;32m    168\u001B[0m \u001B[38;5;28;01melse\u001B[39;00m:\n\u001B[0;32m    169\u001B[0m     op \u001B[38;5;241m=\u001B[39m _MergeOperation(\n\u001B[0;32m    170\u001B[0m         left_df,\n\u001B[0;32m    171\u001B[0m         right_df,\n\u001B[1;32m   (...)\u001B[0m\n\u001B[0;32m    181\u001B[0m         validate\u001B[38;5;241m=\u001B[39mvalidate,\n\u001B[0;32m    182\u001B[0m     )\n\u001B[1;32m--> 183\u001B[0m     \u001B[38;5;28;01mreturn\u001B[39;00m op\u001B[38;5;241m.\u001B[39mget_result(copy\u001B[38;5;241m=\u001B[39mcopy)\n",
      "File \u001B[1;32mD:\\Anaconda\\Lib\\site-packages\\pandas\\core\\reshape\\merge.py:885\u001B[0m, in \u001B[0;36m_MergeOperation.get_result\u001B[1;34m(self, copy)\u001B[0m\n\u001B[0;32m    881\u001B[0m     \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39mleft, \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39mright \u001B[38;5;241m=\u001B[39m \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39m_indicator_pre_merge(\u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39mleft, \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39mright)\n\u001B[0;32m    883\u001B[0m join_index, left_indexer, right_indexer \u001B[38;5;241m=\u001B[39m \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39m_get_join_info()\n\u001B[1;32m--> 885\u001B[0m result \u001B[38;5;241m=\u001B[39m \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39m_reindex_and_concat(\n\u001B[0;32m    886\u001B[0m     join_index, left_indexer, right_indexer, copy\u001B[38;5;241m=\u001B[39mcopy\n\u001B[0;32m    887\u001B[0m )\n\u001B[0;32m    888\u001B[0m result \u001B[38;5;241m=\u001B[39m result\u001B[38;5;241m.\u001B[39m__finalize__(\u001B[38;5;28mself\u001B[39m, method\u001B[38;5;241m=\u001B[39m\u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39m_merge_type)\n\u001B[0;32m    890\u001B[0m \u001B[38;5;28;01mif\u001B[39;00m \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39mindicator:\n",
      "File \u001B[1;32mD:\\Anaconda\\Lib\\site-packages\\pandas\\core\\reshape\\merge.py:876\u001B[0m, in \u001B[0;36m_MergeOperation._reindex_and_concat\u001B[1;34m(self, join_index, left_indexer, right_indexer, copy)\u001B[0m\n\u001B[0;32m    874\u001B[0m left\u001B[38;5;241m.\u001B[39mcolumns \u001B[38;5;241m=\u001B[39m llabels\n\u001B[0;32m    875\u001B[0m right\u001B[38;5;241m.\u001B[39mcolumns \u001B[38;5;241m=\u001B[39m rlabels\n\u001B[1;32m--> 876\u001B[0m result \u001B[38;5;241m=\u001B[39m concat([left, right], axis\u001B[38;5;241m=\u001B[39m\u001B[38;5;241m1\u001B[39m, copy\u001B[38;5;241m=\u001B[39mcopy)\n\u001B[0;32m    877\u001B[0m \u001B[38;5;28;01mreturn\u001B[39;00m result\n",
      "File \u001B[1;32mD:\\Anaconda\\Lib\\site-packages\\pandas\\core\\reshape\\concat.py:393\u001B[0m, in \u001B[0;36mconcat\u001B[1;34m(objs, axis, join, ignore_index, keys, levels, names, verify_integrity, sort, copy)\u001B[0m\n\u001B[0;32m    378\u001B[0m     copy \u001B[38;5;241m=\u001B[39m \u001B[38;5;28;01mFalse\u001B[39;00m\n\u001B[0;32m    380\u001B[0m op \u001B[38;5;241m=\u001B[39m _Concatenator(\n\u001B[0;32m    381\u001B[0m     objs,\n\u001B[0;32m    382\u001B[0m     axis\u001B[38;5;241m=\u001B[39maxis,\n\u001B[1;32m   (...)\u001B[0m\n\u001B[0;32m    390\u001B[0m     sort\u001B[38;5;241m=\u001B[39msort,\n\u001B[0;32m    391\u001B[0m )\n\u001B[1;32m--> 393\u001B[0m \u001B[38;5;28;01mreturn\u001B[39;00m op\u001B[38;5;241m.\u001B[39mget_result()\n",
      "File \u001B[1;32mD:\\Anaconda\\Lib\\site-packages\\pandas\\core\\reshape\\concat.py:680\u001B[0m, in \u001B[0;36m_Concatenator.get_result\u001B[1;34m(self)\u001B[0m\n\u001B[0;32m    676\u001B[0m             indexers[ax] \u001B[38;5;241m=\u001B[39m obj_labels\u001B[38;5;241m.\u001B[39mget_indexer(new_labels)\n\u001B[0;32m    678\u001B[0m     mgrs_indexers\u001B[38;5;241m.\u001B[39mappend((obj\u001B[38;5;241m.\u001B[39m_mgr, indexers))\n\u001B[1;32m--> 680\u001B[0m new_data \u001B[38;5;241m=\u001B[39m concatenate_managers(\n\u001B[0;32m    681\u001B[0m     mgrs_indexers, \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39mnew_axes, concat_axis\u001B[38;5;241m=\u001B[39m\u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39mbm_axis, copy\u001B[38;5;241m=\u001B[39m\u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39mcopy\n\u001B[0;32m    682\u001B[0m )\n\u001B[0;32m    683\u001B[0m \u001B[38;5;28;01mif\u001B[39;00m \u001B[38;5;129;01mnot\u001B[39;00m \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39mcopy \u001B[38;5;129;01mand\u001B[39;00m \u001B[38;5;129;01mnot\u001B[39;00m using_copy_on_write():\n\u001B[0;32m    684\u001B[0m     new_data\u001B[38;5;241m.\u001B[39m_consolidate_inplace()\n",
      "File \u001B[1;32mD:\\Anaconda\\Lib\\site-packages\\pandas\\core\\internals\\concat.py:131\u001B[0m, in \u001B[0;36mconcatenate_managers\u001B[1;34m(mgrs_indexers, axes, concat_axis, copy)\u001B[0m\n\u001B[0;32m    124\u001B[0m \u001B[38;5;66;03m# Assertions disabled for performance\u001B[39;00m\n\u001B[0;32m    125\u001B[0m \u001B[38;5;66;03m# for tup in mgrs_indexers:\u001B[39;00m\n\u001B[0;32m    126\u001B[0m \u001B[38;5;66;03m#    # caller is responsible for ensuring this\u001B[39;00m\n\u001B[0;32m    127\u001B[0m \u001B[38;5;66;03m#    indexers = tup[1]\u001B[39;00m\n\u001B[0;32m    128\u001B[0m \u001B[38;5;66;03m#    assert concat_axis not in indexers\u001B[39;00m\n\u001B[0;32m    130\u001B[0m \u001B[38;5;28;01mif\u001B[39;00m concat_axis \u001B[38;5;241m==\u001B[39m \u001B[38;5;241m0\u001B[39m:\n\u001B[1;32m--> 131\u001B[0m     mgrs \u001B[38;5;241m=\u001B[39m _maybe_reindex_columns_na_proxy(axes, mgrs_indexers, needs_copy)\n\u001B[0;32m    132\u001B[0m     \u001B[38;5;28;01mreturn\u001B[39;00m mgrs[\u001B[38;5;241m0\u001B[39m]\u001B[38;5;241m.\u001B[39mconcat_horizontal(mgrs, axes)\n\u001B[0;32m    134\u001B[0m \u001B[38;5;28;01mif\u001B[39;00m \u001B[38;5;28mlen\u001B[39m(mgrs_indexers) \u001B[38;5;241m>\u001B[39m \u001B[38;5;241m0\u001B[39m \u001B[38;5;129;01mand\u001B[39;00m mgrs_indexers[\u001B[38;5;241m0\u001B[39m][\u001B[38;5;241m0\u001B[39m]\u001B[38;5;241m.\u001B[39mnblocks \u001B[38;5;241m>\u001B[39m \u001B[38;5;241m0\u001B[39m:\n",
      "File \u001B[1;32mD:\\Anaconda\\Lib\\site-packages\\pandas\\core\\internals\\concat.py:230\u001B[0m, in \u001B[0;36m_maybe_reindex_columns_na_proxy\u001B[1;34m(axes, mgrs_indexers, needs_copy)\u001B[0m\n\u001B[0;32m    220\u001B[0m         mgr \u001B[38;5;241m=\u001B[39m mgr\u001B[38;5;241m.\u001B[39mreindex_indexer(\n\u001B[0;32m    221\u001B[0m             axes[i],\n\u001B[0;32m    222\u001B[0m             indexers[i],\n\u001B[1;32m   (...)\u001B[0m\n\u001B[0;32m    227\u001B[0m             use_na_proxy\u001B[38;5;241m=\u001B[39m\u001B[38;5;28;01mTrue\u001B[39;00m,  \u001B[38;5;66;03m# only relevant for i==0\u001B[39;00m\n\u001B[0;32m    228\u001B[0m         )\n\u001B[0;32m    229\u001B[0m     \u001B[38;5;28;01mif\u001B[39;00m needs_copy \u001B[38;5;129;01mand\u001B[39;00m \u001B[38;5;129;01mnot\u001B[39;00m indexers:\n\u001B[1;32m--> 230\u001B[0m         mgr \u001B[38;5;241m=\u001B[39m mgr\u001B[38;5;241m.\u001B[39mcopy()\n\u001B[0;32m    232\u001B[0m     new_mgrs\u001B[38;5;241m.\u001B[39mappend(mgr)\n\u001B[0;32m    233\u001B[0m \u001B[38;5;28;01mreturn\u001B[39;00m new_mgrs\n",
      "File \u001B[1;32mD:\\Anaconda\\Lib\\site-packages\\pandas\\core\\internals\\managers.py:576\u001B[0m, in \u001B[0;36mBaseBlockManager.copy\u001B[1;34m(self, deep)\u001B[0m\n\u001B[0;32m    573\u001B[0m     \u001B[38;5;28;01melse\u001B[39;00m:\n\u001B[0;32m    574\u001B[0m         new_axes \u001B[38;5;241m=\u001B[39m \u001B[38;5;28mlist\u001B[39m(\u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39maxes)\n\u001B[1;32m--> 576\u001B[0m res \u001B[38;5;241m=\u001B[39m \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39mapply(\u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mcopy\u001B[39m\u001B[38;5;124m\"\u001B[39m, deep\u001B[38;5;241m=\u001B[39mdeep)\n\u001B[0;32m    577\u001B[0m res\u001B[38;5;241m.\u001B[39maxes \u001B[38;5;241m=\u001B[39m new_axes\n\u001B[0;32m    579\u001B[0m \u001B[38;5;28;01mif\u001B[39;00m \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39mndim \u001B[38;5;241m>\u001B[39m \u001B[38;5;241m1\u001B[39m:\n\u001B[0;32m    580\u001B[0m     \u001B[38;5;66;03m# Avoid needing to re-compute these\u001B[39;00m\n",
      "File \u001B[1;32mD:\\Anaconda\\Lib\\site-packages\\pandas\\core\\internals\\managers.py:354\u001B[0m, in \u001B[0;36mBaseBlockManager.apply\u001B[1;34m(self, f, align_keys, **kwargs)\u001B[0m\n\u001B[0;32m    352\u001B[0m         applied \u001B[38;5;241m=\u001B[39m b\u001B[38;5;241m.\u001B[39mapply(f, \u001B[38;5;241m*\u001B[39m\u001B[38;5;241m*\u001B[39mkwargs)\n\u001B[0;32m    353\u001B[0m     \u001B[38;5;28;01melse\u001B[39;00m:\n\u001B[1;32m--> 354\u001B[0m         applied \u001B[38;5;241m=\u001B[39m \u001B[38;5;28mgetattr\u001B[39m(b, f)(\u001B[38;5;241m*\u001B[39m\u001B[38;5;241m*\u001B[39mkwargs)\n\u001B[0;32m    355\u001B[0m     result_blocks \u001B[38;5;241m=\u001B[39m extend_blocks(applied, result_blocks)\n\u001B[0;32m    357\u001B[0m out \u001B[38;5;241m=\u001B[39m \u001B[38;5;28mtype\u001B[39m(\u001B[38;5;28mself\u001B[39m)\u001B[38;5;241m.\u001B[39mfrom_blocks(result_blocks, \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39maxes)\n",
      "File \u001B[1;32mD:\\Anaconda\\Lib\\site-packages\\pandas\\core\\internals\\blocks.py:645\u001B[0m, in \u001B[0;36mBlock.copy\u001B[1;34m(self, deep)\u001B[0m\n\u001B[0;32m    643\u001B[0m refs: BlockValuesRefs \u001B[38;5;241m|\u001B[39m \u001B[38;5;28;01mNone\u001B[39;00m\n\u001B[0;32m    644\u001B[0m \u001B[38;5;28;01mif\u001B[39;00m deep:\n\u001B[1;32m--> 645\u001B[0m     values \u001B[38;5;241m=\u001B[39m values\u001B[38;5;241m.\u001B[39mcopy()\n\u001B[0;32m    646\u001B[0m     refs \u001B[38;5;241m=\u001B[39m \u001B[38;5;28;01mNone\u001B[39;00m\n\u001B[0;32m    647\u001B[0m \u001B[38;5;28;01melse\u001B[39;00m:\n",
      "\u001B[1;31mMemoryError\u001B[0m: Unable to allocate 17.1 GiB for an array with shape (170, 13478955) and data type int64"
     ]
    }
   ],
   "execution_count": 89
  },
  {
   "cell_type": "code",
   "id": "bb9c199f894c3286",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-09-27T14:09:58.533103Z",
     "start_time": "2024-09-27T14:09:58.183056Z"
    }
   },
   "source": "df_final",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "          Idx  UserInfo_1 UserInfo_2  UserInfo_3 UserInfo_4  WeblogInfo_2  \\\n",
       "0       10001         1.0         深圳         4.0         深圳           1.0   \n",
       "1       10001         1.0         深圳         4.0         深圳           1.0   \n",
       "2       10001         1.0         深圳         4.0         深圳           1.0   \n",
       "3       10001         1.0         深圳         4.0         深圳           1.0   \n",
       "4       10001         1.0         深圳         4.0         深圳           1.0   \n",
       "...       ...         ...        ...         ...        ...           ...   \n",
       "968083   9994         4.0         上海         5.0         常州           0.0   \n",
       "968084   9994         4.0         上海         5.0         常州           0.0   \n",
       "968085   9994         4.0         上海         5.0         常州           0.0   \n",
       "968086   9994         4.0         上海         5.0         常州           0.0   \n",
       "968087   9994         4.0         上海         5.0         常州           0.0   \n",
       "\n",
       "        WeblogInfo_4  WeblogInfo_5  WeblogInfo_6  WeblogInfo_7  ...  \\\n",
       "0                1.0           1.0           1.0            14  ...   \n",
       "1                1.0           1.0           1.0            14  ...   \n",
       "2                1.0           1.0           1.0            14  ...   \n",
       "3                1.0           1.0           1.0            14  ...   \n",
       "4                1.0           1.0           1.0            14  ...   \n",
       "...              ...           ...           ...           ...  ...   \n",
       "968083           1.0           1.0           1.0             4  ...   \n",
       "968084           1.0           1.0           1.0             4  ...   \n",
       "968085           1.0           1.0           1.0             4  ...   \n",
       "968086           1.0           1.0           1.0             4  ...   \n",
       "968087           1.0           1.0           1.0             4  ...   \n",
       "\n",
       "        first_login  last_login  login_duration  logins_per_day  \\\n",
       "0        2014-02-20  2014-03-04           288.0             9.0   \n",
       "1        2014-02-20  2014-03-04           288.0             2.0   \n",
       "2        2014-02-20  2014-03-04           288.0             2.0   \n",
       "3        2014-02-20  2014-03-04           288.0             2.0   \n",
       "4        2014-02-20  2014-03-04           288.0             2.0   \n",
       "...             ...         ...             ...             ...   \n",
       "968083   2014-02-20  2014-02-28           192.0             1.0   \n",
       "968084   2014-02-20  2014-02-28           192.0             9.0   \n",
       "968085   2014-02-20  2014-02-28           192.0             9.0   \n",
       "968086   2014-02-20  2014-02-28           192.0             9.0   \n",
       "968087   2014-02-20  2014-02-28           192.0             9.0   \n",
       "\n",
       "        login_time_interval  login_hour_block  weekend_login  listing_year  \\\n",
       "0                       0.0         0:00-4:00            0.0        2014.0   \n",
       "1                    4320.0         0:00-4:00            1.0        2014.0   \n",
       "2                    1440.0         0:00-4:00            0.0        2014.0   \n",
       "3                    1440.0         0:00-4:00            0.0        2014.0   \n",
       "4                    2880.0         0:00-4:00            0.0        2014.0   \n",
       "...                     ...               ...            ...           ...   \n",
       "968083              11520.0         0:00-4:00            0.0        2014.0   \n",
       "968084             -11520.0         0:00-4:00            0.0        2014.0   \n",
       "968085                  0.0         0:00-4:00            0.0        2014.0   \n",
       "968086                  0.0         0:00-4:00            0.0        2014.0   \n",
       "968087                  0.0         0:00-4:00            0.0        2014.0   \n",
       "\n",
       "        login_month  login_second  \n",
       "0               2.0           0.0  \n",
       "1               2.0           0.0  \n",
       "2               2.0           0.0  \n",
       "3               2.0           0.0  \n",
       "4               2.0           0.0  \n",
       "...             ...           ...  \n",
       "968083          2.0           0.0  \n",
       "968084          2.0           0.0  \n",
       "968085          2.0           0.0  \n",
       "968086          2.0           0.0  \n",
       "968087          2.0           0.0  \n",
       "\n",
       "[968088 rows x 255 columns]"
      ],
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Idx</th>\n",
       "      <th>UserInfo_1</th>\n",
       "      <th>UserInfo_2</th>\n",
       "      <th>UserInfo_3</th>\n",
       "      <th>UserInfo_4</th>\n",
       "      <th>WeblogInfo_2</th>\n",
       "      <th>WeblogInfo_4</th>\n",
       "      <th>WeblogInfo_5</th>\n",
       "      <th>WeblogInfo_6</th>\n",
       "      <th>WeblogInfo_7</th>\n",
       "      <th>...</th>\n",
       "      <th>first_login</th>\n",
       "      <th>last_login</th>\n",
       "      <th>login_duration</th>\n",
       "      <th>logins_per_day</th>\n",
       "      <th>login_time_interval</th>\n",
       "      <th>login_hour_block</th>\n",
       "      <th>weekend_login</th>\n",
       "      <th>listing_year</th>\n",
       "      <th>login_month</th>\n",
       "      <th>login_second</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>10001</td>\n",
       "      <td>1.0</td>\n",
       "      <td>深圳</td>\n",
       "      <td>4.0</td>\n",
       "      <td>深圳</td>\n",
       "      <td>1.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>14</td>\n",
       "      <td>...</td>\n",
       "      <td>2014-02-20</td>\n",
       "      <td>2014-03-04</td>\n",
       "      <td>288.0</td>\n",
       "      <td>9.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0:00-4:00</td>\n",
       "      <td>0.0</td>\n",
       "      <td>2014.0</td>\n",
       "      <td>2.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>10001</td>\n",
       "      <td>1.0</td>\n",
       "      <td>深圳</td>\n",
       "      <td>4.0</td>\n",
       "      <td>深圳</td>\n",
       "      <td>1.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>14</td>\n",
       "      <td>...</td>\n",
       "      <td>2014-02-20</td>\n",
       "      <td>2014-03-04</td>\n",
       "      <td>288.0</td>\n",
       "      <td>2.0</td>\n",
       "      <td>4320.0</td>\n",
       "      <td>0:00-4:00</td>\n",
       "      <td>1.0</td>\n",
       "      <td>2014.0</td>\n",
       "      <td>2.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>10001</td>\n",
       "      <td>1.0</td>\n",
       "      <td>深圳</td>\n",
       "      <td>4.0</td>\n",
       "      <td>深圳</td>\n",
       "      <td>1.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>14</td>\n",
       "      <td>...</td>\n",
       "      <td>2014-02-20</td>\n",
       "      <td>2014-03-04</td>\n",
       "      <td>288.0</td>\n",
       "      <td>2.0</td>\n",
       "      <td>1440.0</td>\n",
       "      <td>0:00-4:00</td>\n",
       "      <td>0.0</td>\n",
       "      <td>2014.0</td>\n",
       "      <td>2.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>10001</td>\n",
       "      <td>1.0</td>\n",
       "      <td>深圳</td>\n",
       "      <td>4.0</td>\n",
       "      <td>深圳</td>\n",
       "      <td>1.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>14</td>\n",
       "      <td>...</td>\n",
       "      <td>2014-02-20</td>\n",
       "      <td>2014-03-04</td>\n",
       "      <td>288.0</td>\n",
       "      <td>2.0</td>\n",
       "      <td>1440.0</td>\n",
       "      <td>0:00-4:00</td>\n",
       "      <td>0.0</td>\n",
       "      <td>2014.0</td>\n",
       "      <td>2.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>10001</td>\n",
       "      <td>1.0</td>\n",
       "      <td>深圳</td>\n",
       "      <td>4.0</td>\n",
       "      <td>深圳</td>\n",
       "      <td>1.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>14</td>\n",
       "      <td>...</td>\n",
       "      <td>2014-02-20</td>\n",
       "      <td>2014-03-04</td>\n",
       "      <td>288.0</td>\n",
       "      <td>2.0</td>\n",
       "      <td>2880.0</td>\n",
       "      <td>0:00-4:00</td>\n",
       "      <td>0.0</td>\n",
       "      <td>2014.0</td>\n",
       "      <td>2.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>968083</th>\n",
       "      <td>9994</td>\n",
       "      <td>4.0</td>\n",
       "      <td>上海</td>\n",
       "      <td>5.0</td>\n",
       "      <td>常州</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>4</td>\n",
       "      <td>...</td>\n",
       "      <td>2014-02-20</td>\n",
       "      <td>2014-02-28</td>\n",
       "      <td>192.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>11520.0</td>\n",
       "      <td>0:00-4:00</td>\n",
       "      <td>0.0</td>\n",
       "      <td>2014.0</td>\n",
       "      <td>2.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>968084</th>\n",
       "      <td>9994</td>\n",
       "      <td>4.0</td>\n",
       "      <td>上海</td>\n",
       "      <td>5.0</td>\n",
       "      <td>常州</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>4</td>\n",
       "      <td>...</td>\n",
       "      <td>2014-02-20</td>\n",
       "      <td>2014-02-28</td>\n",
       "      <td>192.0</td>\n",
       "      <td>9.0</td>\n",
       "      <td>-11520.0</td>\n",
       "      <td>0:00-4:00</td>\n",
       "      <td>0.0</td>\n",
       "      <td>2014.0</td>\n",
       "      <td>2.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>968085</th>\n",
       "      <td>9994</td>\n",
       "      <td>4.0</td>\n",
       "      <td>上海</td>\n",
       "      <td>5.0</td>\n",
       "      <td>常州</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>4</td>\n",
       "      <td>...</td>\n",
       "      <td>2014-02-20</td>\n",
       "      <td>2014-02-28</td>\n",
       "      <td>192.0</td>\n",
       "      <td>9.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0:00-4:00</td>\n",
       "      <td>0.0</td>\n",
       "      <td>2014.0</td>\n",
       "      <td>2.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>968086</th>\n",
       "      <td>9994</td>\n",
       "      <td>4.0</td>\n",
       "      <td>上海</td>\n",
       "      <td>5.0</td>\n",
       "      <td>常州</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>4</td>\n",
       "      <td>...</td>\n",
       "      <td>2014-02-20</td>\n",
       "      <td>2014-02-28</td>\n",
       "      <td>192.0</td>\n",
       "      <td>9.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0:00-4:00</td>\n",
       "      <td>0.0</td>\n",
       "      <td>2014.0</td>\n",
       "      <td>2.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>968087</th>\n",
       "      <td>9994</td>\n",
       "      <td>4.0</td>\n",
       "      <td>上海</td>\n",
       "      <td>5.0</td>\n",
       "      <td>常州</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>4</td>\n",
       "      <td>...</td>\n",
       "      <td>2014-02-20</td>\n",
       "      <td>2014-02-28</td>\n",
       "      <td>192.0</td>\n",
       "      <td>9.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0:00-4:00</td>\n",
       "      <td>0.0</td>\n",
       "      <td>2014.0</td>\n",
       "      <td>2.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>968088 rows × 255 columns</p>\n",
       "</div>"
      ]
     },
     "execution_count": 90,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 90
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-09-27T14:10:12.877951Z",
     "start_time": "2024-09-27T14:10:11.984676Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# from sklearn.model_selection import train_test_split\n",
    "#  \n",
    "# X_train,X_test, y_train, y_test = train_test_split(df_final[df_final.sample_status=='train'].drop(['Idx','sample_status','target'],axis=1),\n",
    "#  df_final[df_final.sample_status=='train']['target'],test_size=0.3, random_state=0)\n",
    "#  \n",
    "# train_fea =  np.array(X_train)\n",
    "# test_fea = np.array(X_test)\n",
    "# evaluate_fea = np.array(df_final[df_final.sample_status=='test'].drop(['Idx','sample_status','target'],axis=1))\n",
    "#  \n",
    "# # # reshape(-1,1转成一列\n",
    "# train_label = np.array(y_train).reshape(-1,1)\n",
    "# test_label = np.array(y_test).reshape(-1,1)\n",
    "# evaluate_label = np.array(df_final[df_final.sample_status=='test']['target']).reshape(-1,1)\n",
    "#  \n",
    "#  \n",
    "# fea_names = list(X_train.columns)\n",
    "# feature_importance_values = np.zeros(len(fea_names))\n",
    "# feature_importance_values\n",
    "numeric_columns = df_final.select_dtypes(exclude=['object','datetime64'])\n",
    "numeric_columns\n",
    "# df_final.info()"
   ],
   "id": "352a6c9997b200a3",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "          Idx  UserInfo_1  UserInfo_3  WeblogInfo_2  WeblogInfo_4  \\\n",
       "0       10001         1.0         4.0           1.0           1.0   \n",
       "1       10001         1.0         4.0           1.0           1.0   \n",
       "2       10001         1.0         4.0           1.0           1.0   \n",
       "3       10001         1.0         4.0           1.0           1.0   \n",
       "4       10001         1.0         4.0           1.0           1.0   \n",
       "...       ...         ...         ...           ...           ...   \n",
       "968083   9994         4.0         5.0           0.0           1.0   \n",
       "968084   9994         4.0         5.0           0.0           1.0   \n",
       "968085   9994         4.0         5.0           0.0           1.0   \n",
       "968086   9994         4.0         5.0           0.0           1.0   \n",
       "968087   9994         4.0         5.0           0.0           1.0   \n",
       "\n",
       "        WeblogInfo_5  WeblogInfo_6  WeblogInfo_7  WeblogInfo_8  WeblogInfo_9  \\\n",
       "0                1.0           1.0            14             0             0   \n",
       "1                1.0           1.0            14             0             0   \n",
       "2                1.0           1.0            14             0             0   \n",
       "3                1.0           1.0            14             0             0   \n",
       "4                1.0           1.0            14             0             0   \n",
       "...              ...           ...           ...           ...           ...   \n",
       "968083           1.0           1.0             4             0             0   \n",
       "968084           1.0           1.0             4             0             0   \n",
       "968085           1.0           1.0             4             0             0   \n",
       "968086           1.0           1.0             4             0             0   \n",
       "968087           1.0           1.0             4             0             0   \n",
       "\n",
       "        ...  is_logout  is_info_update  total_actions  login_duration  \\\n",
       "0       ...        0.0             0.0           19.0           288.0   \n",
       "1       ...        0.0             0.0           19.0           288.0   \n",
       "2       ...        0.0             0.0           19.0           288.0   \n",
       "3       ...        0.0             0.0           19.0           288.0   \n",
       "4       ...        0.0             0.0           19.0           288.0   \n",
       "...     ...        ...             ...            ...             ...   \n",
       "968083  ...        0.0             0.0           10.0           192.0   \n",
       "968084  ...        0.0             0.0           10.0           192.0   \n",
       "968085  ...        0.0             0.0           10.0           192.0   \n",
       "968086  ...        0.0             0.0           10.0           192.0   \n",
       "968087  ...        0.0             0.0           10.0           192.0   \n",
       "\n",
       "        logins_per_day  login_time_interval  weekend_login  listing_year  \\\n",
       "0                  9.0                  0.0            0.0        2014.0   \n",
       "1                  2.0               4320.0            1.0        2014.0   \n",
       "2                  2.0               1440.0            0.0        2014.0   \n",
       "3                  2.0               1440.0            0.0        2014.0   \n",
       "4                  2.0               2880.0            0.0        2014.0   \n",
       "...                ...                  ...            ...           ...   \n",
       "968083             1.0              11520.0            0.0        2014.0   \n",
       "968084             9.0             -11520.0            0.0        2014.0   \n",
       "968085             9.0                  0.0            0.0        2014.0   \n",
       "968086             9.0                  0.0            0.0        2014.0   \n",
       "968087             9.0                  0.0            0.0        2014.0   \n",
       "\n",
       "        login_month  login_second  \n",
       "0               2.0           0.0  \n",
       "1               2.0           0.0  \n",
       "2               2.0           0.0  \n",
       "3               2.0           0.0  \n",
       "4               2.0           0.0  \n",
       "...             ...           ...  \n",
       "968083          2.0           0.0  \n",
       "968084          2.0           0.0  \n",
       "968085          2.0           0.0  \n",
       "968086          2.0           0.0  \n",
       "968087          2.0           0.0  \n",
       "\n",
       "[968088 rows x 225 columns]"
      ],
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Idx</th>\n",
       "      <th>UserInfo_1</th>\n",
       "      <th>UserInfo_3</th>\n",
       "      <th>WeblogInfo_2</th>\n",
       "      <th>WeblogInfo_4</th>\n",
       "      <th>WeblogInfo_5</th>\n",
       "      <th>WeblogInfo_6</th>\n",
       "      <th>WeblogInfo_7</th>\n",
       "      <th>WeblogInfo_8</th>\n",
       "      <th>WeblogInfo_9</th>\n",
       "      <th>...</th>\n",
       "      <th>is_logout</th>\n",
       "      <th>is_info_update</th>\n",
       "      <th>total_actions</th>\n",
       "      <th>login_duration</th>\n",
       "      <th>logins_per_day</th>\n",
       "      <th>login_time_interval</th>\n",
       "      <th>weekend_login</th>\n",
       "      <th>listing_year</th>\n",
       "      <th>login_month</th>\n",
       "      <th>login_second</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>10001</td>\n",
       "      <td>1.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>14</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>19.0</td>\n",
       "      <td>288.0</td>\n",
       "      <td>9.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>2014.0</td>\n",
       "      <td>2.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>10001</td>\n",
       "      <td>1.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>14</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>19.0</td>\n",
       "      <td>288.0</td>\n",
       "      <td>2.0</td>\n",
       "      <td>4320.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>2014.0</td>\n",
       "      <td>2.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>10001</td>\n",
       "      <td>1.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>14</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>19.0</td>\n",
       "      <td>288.0</td>\n",
       "      <td>2.0</td>\n",
       "      <td>1440.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>2014.0</td>\n",
       "      <td>2.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>10001</td>\n",
       "      <td>1.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>14</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>19.0</td>\n",
       "      <td>288.0</td>\n",
       "      <td>2.0</td>\n",
       "      <td>1440.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>2014.0</td>\n",
       "      <td>2.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>10001</td>\n",
       "      <td>1.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>14</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>19.0</td>\n",
       "      <td>288.0</td>\n",
       "      <td>2.0</td>\n",
       "      <td>2880.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>2014.0</td>\n",
       "      <td>2.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>968083</th>\n",
       "      <td>9994</td>\n",
       "      <td>4.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>4</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>10.0</td>\n",
       "      <td>192.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>11520.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>2014.0</td>\n",
       "      <td>2.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>968084</th>\n",
       "      <td>9994</td>\n",
       "      <td>4.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>4</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>10.0</td>\n",
       "      <td>192.0</td>\n",
       "      <td>9.0</td>\n",
       "      <td>-11520.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>2014.0</td>\n",
       "      <td>2.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>968085</th>\n",
       "      <td>9994</td>\n",
       "      <td>4.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>4</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>10.0</td>\n",
       "      <td>192.0</td>\n",
       "      <td>9.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>2014.0</td>\n",
       "      <td>2.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>968086</th>\n",
       "      <td>9994</td>\n",
       "      <td>4.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>4</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>10.0</td>\n",
       "      <td>192.0</td>\n",
       "      <td>9.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>2014.0</td>\n",
       "      <td>2.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>968087</th>\n",
       "      <td>9994</td>\n",
       "      <td>4.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>4</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>10.0</td>\n",
       "      <td>192.0</td>\n",
       "      <td>9.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>2014.0</td>\n",
       "      <td>2.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>968088 rows × 225 columns</p>\n",
       "</div>"
      ]
     },
     "execution_count": 91,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 91
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-09-27T14:14:14.165204Z",
     "start_time": "2024-09-27T14:13:51.252020Z"
    }
   },
   "cell_type": "code",
   "source": [
    "from sklearn.model_selection import train_test_split\n",
    "import lightgbm as lgb\n",
    "X= df_final[df_final.sample_status=='train'].drop(['Idx','sample_status','target'],axis=1).select_dtypes(exclude=['object','datetime64'])\n",
    "y =  df_final[df_final.sample_status=='train']['target']\n",
    " \n",
    "# 划分训练集和测试集\n",
    "x_train,x_test, y_train, y_test = train_test_split(X,y,test_size=0.2)\n",
    " \n",
    "# 训练模型\n",
    "lgb_sklearn = lgb.LGBMClassifier(random_state=0).fit(x_train,y_train)\n",
    " \n",
    "# # 预测测试集的样本\n",
    "lgb_sklearn_pre  = lgb_sklearn.predict_proba(x_test)\n",
    " \n",
    " ###计算roc和auc\n",
    "from sklearn.metrics import roc_curve, auc \n",
    "def acu_curve(y,prob):\n",
    "    #  y真实,\n",
    "    #  prob预测\n",
    "    fpr,tpr,threshold = roc_curve(y,prob) ###计算真阳性率(真正率)和假阳性率(假正率)\n",
    "    roc_auc = auc(fpr,tpr) ###计算auc的值\n",
    " \n",
    "    print(roc_auc)\n",
    "    plt.figure()\n",
    "    lw = 2\n",
    "    plt.figure(figsize=(12,10))\n",
    "    plt.plot(fpr, tpr, color='darkorange',\n",
    "             lw=lw, label='ROC curve (AUC = %0.3f)' % roc_auc) ###假正率为横坐标，真正率为纵坐标做曲线\n",
    "    plt.plot([0, 1], [0, 1], color='navy', lw=lw, linestyle='--')\n",
    "    plt.xlim([0.0, 1.0])\n",
    "    plt.ylim([0.0, 1.05])\n",
    "    plt.xlabel('False Positive Rate')\n",
    "    plt.ylabel('True Positive Rate')\n",
    "    plt.title('AUC')\n",
    "    plt.legend(loc=\"lower right\")\n",
    " \n",
    "    plt.show()\n",
    " \n",
    "acu_curve(y_test,lgb_sklearn_pre[:,1])"
   ],
   "id": "5d96f94feaaf5c46",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[LightGBM] [Info] Number of positive: 36192, number of negative: 429059\n",
      "[LightGBM] [Info] Auto-choosing col-wise multi-threading, the overhead of testing was 0.510449 seconds.\n",
      "You can set `force_col_wise=true` to remove the overhead.\n",
      "[LightGBM] [Info] Total Bins 28525\n",
      "[LightGBM] [Info] Number of data points in the train set: 465251, number of used features: 221\n",
      "[LightGBM] [Info] [binary:BoostFromScore]: pavg=0.077790 -> initscore=-2.472756\n",
      "[LightGBM] [Info] Start training from score -2.472756\n",
      "0.9802244348121775\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<Figure size 640x480 with 0 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "<Figure size 1200x1000 with 1 Axes>"
      ],
      "image/png": "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mjatt5o1q2JxKgBAoNmnuHOOOwAACHG9ejXU7be30S+/HNJrr3VXhQqxVkcCAJQB+xR3AACAEHPwYI6qVCm+2NzYsZdIkpxOG10cCABszja/8Q1XptURAAAASmz+/C266KJp+t//1hUbdzodlHYAsBlLfuunpaVp1KhRat26tdq2bavx48fL7XYf97ErVqzQ1VdfrRYtWqh9+/aaNGnSab2nI3f/mUQGAAAoEx6PV//61zLdeONnysoq1NixX+unnw6c+okAgLBlSXG/4447FBcXp6VLl2rGjBn6/vvvNX369GMet2XLFg0fPlwDBw7U6tWrNWnSJE2dOlXz588v9Xu6K57nh+QAAACBc/hwnnr3fk8vvPCDb6xbt/pq0KCChakAAFYr83Pcd+zYoRUrVuibb75RbGysatWqpVGjRum5557TsGHDij323XffVadOndS3b19JUpMmTfT+++8rISGh9G9scEgZAAAIXr/8ckhDhszS9u1HJEkOh6GHHrpUt97aWgaL7AKArZW6uKenp2vWrFnas2ePxowZo5UrV6pDhw4lfv7mzZuVlJSklJQU31iDBg20d+9eZWZmqly5cr7xdevW6eKLL9Zdd92lZcuWqWLFiho0aJCuvfba0saWDAcLyyNs/blvs48jnLGfI5zNmPGr7rrrC+XlFZ06WKlSrN54o6cuu6y2xckA/+P3OezA3/t3qYr7+vXrNXjwYNWvX18bN27UjTfeqDFjxujRRx9V//79S/QaOTk5io0tfumSP7dzc3OLFfcjR47ov//9r1566SU9++yzWrNmjUaMGKHy5cvriiuuKE10RUdHKTo5sVTPAUJNpUrs4wh/7OcIJy6XR//850JNmLDCN9a6dXV9/PE1ql27vIXJgMDj9zlQcqUq7k8//bTuv/9+9evXT23atFGtWrX06quv6umnny5xcY+Li1NeXl6xsT+34+OLX+4kKipKnTp10uWXXy5JatOmja688kp9/vnnpS7uBS6PslKzSvUcIFQYRtE/fmlpWTJNq9MAgcF+jnCUlpanjz/+1bd9/fXn6s03r1JOTp5S+dyCMMXvc9iBwyFVrOi/L6dKVdw3bdqkK6+8UpJ851q1a9dOd9xxR4lfo2HDhsrIyFBqaqqSk5MlFS1CV7VqVSUmFv/BGjRooMLCwmJjHo9H5mn8DTfl4BcDwp5piv0cYY/9HOGkYsVYTZ3aW/37z9Bjj12mG29sppiYCGVns58j/PH7HOHM3/t2qVZsq1ixorZu3VpsbOvWrb4CXhJ169ZVq1at9NRTTyk7O1u7du3SxIkTNWDAgGMee91112nRokX67LPPZJqmVq5cqdmzZ/u+PCgVFqcDAAAWM01TeXmuYmMtWlTVqlVDdeONzVmEDgBwXKVqswMHDtSIESP04Ycfyu12a968eRozZkypF4ubMGGC3G63OnXqpGuuuUbt2rXTqFGjJEktWrTQrFmzJEkXXXSRJk6cqP/+979q1aqVxo4dq/vuu0+dOnUq1fsV4R9CAABgnbw8l8aMWagbbvhMHo+32H0VKsSe4FkAAEiGWcrjzt955x29++672rNnj6pWraprrrlGgwcPDvpviPPnDFNW25esjgEEhGFIycmJSk3lXDGEL/ZzhLKdO49oyJDZWrfuoCRp9Og2evjhdsc8jv0cdsB+DjtwOPy7AGOpznH/6aefdP311+v6668vNv7NN9/osssu81uogAjyLxYAAEB4Wrx4h0aMmKvDh/MlSXFxEWratLLFqQAAoaRUh8oPHjz4mLHs7GyNGTPGb4EChnPcAQBAGTJNUxMmrNB1133iK+1165bXvHn/p759m1icDgAQSk45475jxw717NnTt5r72WeffcxjWrZsGZBw/uTM/N3qCAAAwCaysgp0++0LNHfu0c8fXbrU08SJ3VW+fIyFyQAAoeiUxb1OnTr66KOPlJmZqeHDh2vy5MnF7o+OjlajRo0CFtBfPAl1rY4AAABsYPPmdA0aNEubN6dLKjpb7557LtJdd10oh4NT9wAApVeic9z/nGWfM2eOatWqFdBAgWJG+m9hAAAAgBOZPHmNr7SXKxet117rri5d6lucCgAQykq1OF1CQoImTJigAwcOyOstuoyJy+XSpk2bfJdwC1osTgcAAMrA449fptWr98nl8mratN6qX7+C1ZEAACGuVMV97Nix2r59uypWrKicnBxVq1ZN33777TGrzAcnijsAAPA/0zSLXRY3NjZSb799lRIToxUfH2lhMgBAuCjVUusrV67UW2+9pfvvv1+1atXS66+/rvHjx2vr1q2ByudHFHcAAOBf69YdUMeOb2vLlsPFxqtWTaC0AwD8plTFPSIiQikpKapbt642btwoSerZs6c2bNgQkHB+xaHyAADA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fv0h39itt7ZWt24NLEwFAEDoK1VxHzx4sHr37i1J+t///qdVq1ZpxIgRevTRRwMSzr84VB4AgED56qttGjlynjIyCiRJcXGRmjChm/r0aWRxMgAAQl+pivvAgQPVrl07RUREqFq1akpPT9c777yjpk2bBiofAAAIYl6vqX//+wc988x3+vNU9gYNKmj69D5q3LiSteEAAAgTpSrukhQZGanZs2drz549qly5snr16hWIXP7H5eAAAPCrnByXbrllnubP3+Ibu+KKBnrllStUrly0hckAAAgvpVqc7ueff1bPnj21cOFCHTlyRF999ZWuvPJKrVq1KlD5AABAkIqOdio31yWp6PvxBx64RNOn96G0AwDgZ6WacX/uuec0ZswY3Xjjjb6xt956S88//7zee+89v4cDAADBKyLCoUmTeuqaaz7Wgw9eqo4d61odCQCAsFSqGfeNGzdq4MCBxcYGDhyoTZs2+TVUYHCoPAAAZ8Lt9mrnziPFxipVitUXX1xPaQcAIIBKVdxjY2O1b9++YmP79u1T+fLl/RoKAAAEl9TUXF177Sfq0+cDHTqUW+w+h4MvxwEACKRSFfcePXpo9OjRWrp0qbZt26YlS5bo9ttvV48ePQKVz29MFqcDAOC0rF27X126vKOlS3dq795s3Xrr5zL/XEIeAAAEXKnOcR8zZozS09M1atQouVwuRUdHq3///ho9enSg8gEAAAu9++4vuu++RSoo8EiSqlSJ1113XSiDL8QBACgzhnkaX5kXFhbqyJEjSk5ODpl/uA9vXiZ3UnOrYwABYRhScnKiUlOzxCQYwhX7edkqKHDrwQcX67//Xecba9OmuqZM6aWqVRMsTBbe2M9hB+znsAOHQ6pUKdFvr1fiGfdXXnlF69ev16WXXqrrr79elStX9luIshEaXzAAAGC1vXuzNHTobK1atd83NmTIeXriicsVFeW0MBkAAPZUonPcn332Wb377ruKjIzUhAkT9MYbbwQ6FwAAsMB33+1S587v+Ep7TIxTL798hf71r06UdgAALFKiGfc5c+borbfeUsOGDfXDDz9o3LhxGj58eKCz+Rkz7gAAnMqWLYeVmlq0anzt2uU0bVofNWtWxeJUAADYW4mKe1ZWlho2bChJatWqlQ4cOBDQUAAAwBo33NBca9bs1+7dWXr99R6qWDHW6kgAANheiYq7w3H0iPqIiFItRA8AAIJYRka+kpJiio3961+d5HQacjpLddVYAAAQICX6FzksrtUaIqvfAwBQVhYu3Ko2baZozpzNxcajopyUdgAAgkiJps/dbrdmzpzp23a5XMW2Jemqq67yYywAABAoXq+p55//Xs8/v1ySNHr0fDVuXEkNG1a0OBkAADieEhX35ORkTZgwwbddoUKFYtuGYYRAcWfGHQCAjIx8jRr1ub78cptv7PLL66haNa7NDgBAsCpRcf/qq68CnQMAAATY+vWHNGjQLO3YcUSS5HAYeuCBSzR6dBsZnFIGAEDQstFKc3wgAQDY18cf/6q77vpCeXluSVLFijGaNKmn2revY3EyAABwKjYq7gAA2I/L5dETTyzVpEmrfWPNm1fRtGl9VKtWOQuTAQCAkmLJWAAAwtihQ7n68MMNvu3rrjtXs2dfS2kHACCE2Ke4c+4eAMCGqldP1KRJPRUT49Szz3bSf/7TVbGxkVbHAgAApVDqQ+ULCwu1ZMkS7dmzR9dee6127NihJk2aBCIbAAAoJdM05XZ7FRnp9I1dfnkdrVw5TCkp8RYmAwAAp6tUxX3nzp0aMmSIXC6XMjMz1b59e/Xv31+vvPKKOnToEKiMfsKMOwAgvOXnu3X//YuUk+PSG2/0LLZSPKUdAIDQVapD5cePH69+/fpp8eLFioiIUL169TRu3Lhi13QHAABlb/fuTPXp84HefXe9Pvtsk157bZXVkQAAgJ+UqrivXbtWw4YNk2EYvm/xr7zySu3atSsg4QAAwKl9881OdenyjtauPSBJio2NUNWqCRanAgAA/lKq4p6YmKjU1NRiY4cOHVL58uX9GgoAAJyaaZp6+eWVuuaaj5WWlidJqlu3vObN+z/168f6MwAAhItSFffevXvrtttu07Jly+T1erVu3Tr985//VM+ePQOVDwAAHEd2dqGGDZujJ59cKq/XlCR17lxPCxder3PPrWxxOgAA4E+lWpxu1KhRys/P12233aa8vDzdcMMNGjBggG677bZA5fMjFqcDAISH339P16BBs7RpU7pv7J//vFD//OdFcjj49w4AgHBTquIeGRmp++67T/fdd5/S09NVoUKFYivWAgCAwHvhheW+0l6uXLQmTuyurl3rW5wKAAAESqmK+8yZM09431VXXXWGUQAAQEk880wnrVmzX9HRTk2b1kf161ewOhIA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rVuXY/UCD1p25NA8H9yrVaumGzduKDY21tZ26tQp+fn5ydvb265v9erVdeLECbu2kydPqlq1ajlSK5BVmRnnkrR69Wr16tVLr7zyiqZNmyZXV9ecLBfIkoyO819//VXR0dF69913FRAQoICAAElSv3799MEHH+R02UCmZObv8ypVqiglJcWuzWw2y2q15kitQFZlZpzHxMSkG+fOzs5ycXHJkVqBnJAdOTTPB/eKFSuqXr16mjhxokwmk86fP6/Q0FB16dIlXd/g4GBFRUVpy5YtSktL05YtWxQVFaWOHTs6oHIg4zIzziMjI/XBBx9o1qxZ6t27twOqBbImo+M8ICBAhw4d0v79+20/kvT5558T3JHrZebv8+7du+vrr7/Whg0bZLVatW/fPm3cuJF/tyDXy8w4b9Gihb788ksdPnxYFotFW7du1d69e//xnmEgL8mOHJrng7skzZw5U2lpaWrZsqW6deumJk2aqH///pIkf39/hYeHS7rzyfWcOXMUFham+vXrKzQ0VLNmzVKlSpUcWT6QIRkd57Nnz5bZbNagQYPk7+9v+xk7dqwjywcyJKPjHMjLMjrOGzVqpNDQUC1dulT16tXTO++8o5EjR6ply5aOLB/IkIyO8wEDBqhnz54aOHCg6tevry+++EJz5sxRzZo1HVk+cN+yO4carKy3AgAAAAAg18oXM+4AAAAAAORXBHcAAAAAAHIxgjsAAAAAALkYwR0AAAAAgFyM4A4AAAAAQC5GcAcAAAAAIBcjuAMAAAAAkIsR3AEAQKbdvn1b165dc3QZGRYdHe3oEgAAyDKCOwAAmdSiRQs9+uij8vf3t/vp3bt3hl7/8MMPa+/evdla04ULF/Twww+rTp06tnrq1KmjNm3aaP369fd9/PDwcAUGBtoeP/PMMzpx4sQ9n8sua9euVY0aNeze48cff1zNmzfXtGnTZLVaM3Scr776Su+991621wcAQE5xdnQBAADkRePGjdOzzz7r6DLS2bRpk8qWLStJslqt2rJli4YPHy5fX181atQoy8cNDg5WcHCw7fH169f/8rnsVLp0ae3cudP22Gw2a9euXRo0aJDKly+vrl27/uMx8tLKAAAA7oUZdwAAstmVK1c0ePBgtWjRQo8//rhatmyp1atX37NvZGSkAgMDVa9ePbVr106hoaG252JjYzV8+HA1btxYTz31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"
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "execution_count": 96
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-09-27T14:16:41.934155Z",
     "start_time": "2024-09-27T14:16:41.755934Z"
    }
   },
   "cell_type": "code",
   "source": "X.isnull().sum()",
   "id": "6f025f0b5cd7c0f",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "UserInfo_1                0\n",
       "UserInfo_3                0\n",
       "WeblogInfo_2              0\n",
       "WeblogInfo_4              0\n",
       "WeblogInfo_5              0\n",
       "                       ... \n",
       "login_time_interval    1013\n",
       "weekend_login          1013\n",
       "listing_year           1013\n",
       "login_month            1013\n",
       "login_second           1013\n",
       "Length: 223, dtype: int64"
      ]
     },
     "execution_count": 99,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 99
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-09-27T14:21:51.972857Z",
     "start_time": "2024-09-27T14:21:50.702805Z"
    }
   },
   "cell_type": "code",
   "source": [
    "from sklearn.ensemble import GradientBoostingClassifier\n",
    "GBC_model = GradientBoostingClassifier()\n",
    "from sklearn.metrics import roc_auc_score\n",
    "GBC_model = GradientBoostingClassifier()\n",
    "GBC_model.fit(X,y)\n",
    "# 预测样本的各类标签（这里是0和1）的概率\n",
    "GBC_model.predict_proba(x_test)\n",
    "# 预测标签为1的概率\n",
    "y_predict = GBC_model.predict_proba(x_test)\n",
    "# AUC值，验证集上的性能结果\n",
    "y_auc = roc_auc_score(y_test,y_predict)\n",
    "y_auc"
   ],
   "id": "8df3882a2d83ca8d",
   "outputs": [
    {
     "ename": "ValueError",
     "evalue": "Input X contains NaN.\nGradientBoostingClassifier does not accept missing values encoded as NaN natively. For supervised learning, you might want to consider sklearn.ensemble.HistGradientBoostingClassifier and Regressor which accept missing values encoded as NaNs natively. Alternatively, it is possible to preprocess the data, for instance by using an imputer transformer in a pipeline or drop samples with missing values. See https://scikit-learn.org/stable/modules/impute.html You can find a list of all estimators that handle NaN values at the following page: https://scikit-learn.org/stable/modules/impute.html#estimators-that-handle-nan-values",
     "output_type": "error",
     "traceback": [
      "\u001B[1;31m---------------------------------------------------------------------------\u001B[0m",
      "\u001B[1;31mValueError\u001B[0m                                Traceback (most recent call last)",
      "Cell \u001B[1;32mIn[103], line 5\u001B[0m\n\u001B[0;32m      3\u001B[0m \u001B[38;5;28;01mfrom\u001B[39;00m \u001B[38;5;21;01msklearn\u001B[39;00m\u001B[38;5;21;01m.\u001B[39;00m\u001B[38;5;21;01mmetrics\u001B[39;00m \u001B[38;5;28;01mimport\u001B[39;00m roc_auc_score\n\u001B[0;32m      4\u001B[0m GBC_model \u001B[38;5;241m=\u001B[39m GradientBoostingClassifier()\n\u001B[1;32m----> 5\u001B[0m GBC_model\u001B[38;5;241m.\u001B[39mfit(X,y)\n\u001B[0;32m      6\u001B[0m \u001B[38;5;66;03m# 预测样本的各类标签（这里是0和1）的概率\u001B[39;00m\n\u001B[0;32m      7\u001B[0m GBC_model\u001B[38;5;241m.\u001B[39mpredict_proba(x_test)\n",
      "File \u001B[1;32mD:\\Anaconda\\Lib\\site-packages\\sklearn\\ensemble\\_gb.py:429\u001B[0m, in \u001B[0;36mBaseGradientBoosting.fit\u001B[1;34m(self, X, y, sample_weight, monitor)\u001B[0m\n\u001B[0;32m    423\u001B[0m     \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39m_clear_state()\n\u001B[0;32m    425\u001B[0m \u001B[38;5;66;03m# Check input\u001B[39;00m\n\u001B[0;32m    426\u001B[0m \u001B[38;5;66;03m# Since check_array converts both X and y to the same dtype, but the\u001B[39;00m\n\u001B[0;32m    427\u001B[0m \u001B[38;5;66;03m# trees use different types for X and y, checking them separately.\u001B[39;00m\n\u001B[1;32m--> 429\u001B[0m X, y \u001B[38;5;241m=\u001B[39m \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39m_validate_data(\n\u001B[0;32m    430\u001B[0m     X, y, accept_sparse\u001B[38;5;241m=\u001B[39m[\u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mcsr\u001B[39m\u001B[38;5;124m\"\u001B[39m, \u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mcsc\u001B[39m\u001B[38;5;124m\"\u001B[39m, \u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mcoo\u001B[39m\u001B[38;5;124m\"\u001B[39m], dtype\u001B[38;5;241m=\u001B[39mDTYPE, multi_output\u001B[38;5;241m=\u001B[39m\u001B[38;5;28;01mTrue\u001B[39;00m\n\u001B[0;32m    431\u001B[0m )\n\u001B[0;32m    433\u001B[0m sample_weight_is_none \u001B[38;5;241m=\u001B[39m sample_weight \u001B[38;5;129;01mis\u001B[39;00m \u001B[38;5;28;01mNone\u001B[39;00m\n\u001B[0;32m    435\u001B[0m sample_weight \u001B[38;5;241m=\u001B[39m _check_sample_weight(sample_weight, X)\n",
      "File \u001B[1;32mD:\\Anaconda\\Lib\\site-packages\\sklearn\\base.py:584\u001B[0m, in \u001B[0;36mBaseEstimator._validate_data\u001B[1;34m(self, X, y, reset, validate_separately, **check_params)\u001B[0m\n\u001B[0;32m    582\u001B[0m         y \u001B[38;5;241m=\u001B[39m check_array(y, input_name\u001B[38;5;241m=\u001B[39m\u001B[38;5;124m\"\u001B[39m\u001B[38;5;124my\u001B[39m\u001B[38;5;124m\"\u001B[39m, \u001B[38;5;241m*\u001B[39m\u001B[38;5;241m*\u001B[39mcheck_y_params)\n\u001B[0;32m    583\u001B[0m     \u001B[38;5;28;01melse\u001B[39;00m:\n\u001B[1;32m--> 584\u001B[0m         X, y \u001B[38;5;241m=\u001B[39m check_X_y(X, y, \u001B[38;5;241m*\u001B[39m\u001B[38;5;241m*\u001B[39mcheck_params)\n\u001B[0;32m    585\u001B[0m     out \u001B[38;5;241m=\u001B[39m X, y\n\u001B[0;32m    587\u001B[0m \u001B[38;5;28;01mif\u001B[39;00m \u001B[38;5;129;01mnot\u001B[39;00m no_val_X \u001B[38;5;129;01mand\u001B[39;00m check_params\u001B[38;5;241m.\u001B[39mget(\u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mensure_2d\u001B[39m\u001B[38;5;124m\"\u001B[39m, \u001B[38;5;28;01mTrue\u001B[39;00m):\n",
      "File \u001B[1;32mD:\\Anaconda\\Lib\\site-packages\\sklearn\\utils\\validation.py:1106\u001B[0m, in \u001B[0;36mcheck_X_y\u001B[1;34m(X, y, accept_sparse, accept_large_sparse, dtype, order, copy, force_all_finite, ensure_2d, allow_nd, multi_output, ensure_min_samples, ensure_min_features, y_numeric, estimator)\u001B[0m\n\u001B[0;32m   1101\u001B[0m         estimator_name \u001B[38;5;241m=\u001B[39m _check_estimator_name(estimator)\n\u001B[0;32m   1102\u001B[0m     \u001B[38;5;28;01mraise\u001B[39;00m \u001B[38;5;167;01mValueError\u001B[39;00m(\n\u001B[0;32m   1103\u001B[0m         \u001B[38;5;124mf\u001B[39m\u001B[38;5;124m\"\u001B[39m\u001B[38;5;132;01m{\u001B[39;00mestimator_name\u001B[38;5;132;01m}\u001B[39;00m\u001B[38;5;124m requires y to be passed, but the target y is None\u001B[39m\u001B[38;5;124m\"\u001B[39m\n\u001B[0;32m   1104\u001B[0m     )\n\u001B[1;32m-> 1106\u001B[0m X \u001B[38;5;241m=\u001B[39m check_array(\n\u001B[0;32m   1107\u001B[0m     X,\n\u001B[0;32m   1108\u001B[0m     accept_sparse\u001B[38;5;241m=\u001B[39maccept_sparse,\n\u001B[0;32m   1109\u001B[0m     accept_large_sparse\u001B[38;5;241m=\u001B[39maccept_large_sparse,\n\u001B[0;32m   1110\u001B[0m     dtype\u001B[38;5;241m=\u001B[39mdtype,\n\u001B[0;32m   1111\u001B[0m     order\u001B[38;5;241m=\u001B[39morder,\n\u001B[0;32m   1112\u001B[0m     copy\u001B[38;5;241m=\u001B[39mcopy,\n\u001B[0;32m   1113\u001B[0m     force_all_finite\u001B[38;5;241m=\u001B[39mforce_all_finite,\n\u001B[0;32m   1114\u001B[0m     ensure_2d\u001B[38;5;241m=\u001B[39mensure_2d,\n\u001B[0;32m   1115\u001B[0m     allow_nd\u001B[38;5;241m=\u001B[39mallow_nd,\n\u001B[0;32m   1116\u001B[0m     ensure_min_samples\u001B[38;5;241m=\u001B[39mensure_min_samples,\n\u001B[0;32m   1117\u001B[0m     ensure_min_features\u001B[38;5;241m=\u001B[39mensure_min_features,\n\u001B[0;32m   1118\u001B[0m     estimator\u001B[38;5;241m=\u001B[39mestimator,\n\u001B[0;32m   1119\u001B[0m     input_name\u001B[38;5;241m=\u001B[39m\u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mX\u001B[39m\u001B[38;5;124m\"\u001B[39m,\n\u001B[0;32m   1120\u001B[0m )\n\u001B[0;32m   1122\u001B[0m y \u001B[38;5;241m=\u001B[39m _check_y(y, multi_output\u001B[38;5;241m=\u001B[39mmulti_output, y_numeric\u001B[38;5;241m=\u001B[39my_numeric, estimator\u001B[38;5;241m=\u001B[39mestimator)\n\u001B[0;32m   1124\u001B[0m check_consistent_length(X, y)\n",
      "File \u001B[1;32mD:\\Anaconda\\Lib\\site-packages\\sklearn\\utils\\validation.py:921\u001B[0m, in \u001B[0;36mcheck_array\u001B[1;34m(array, accept_sparse, accept_large_sparse, dtype, order, copy, force_all_finite, ensure_2d, allow_nd, ensure_min_samples, ensure_min_features, estimator, input_name)\u001B[0m\n\u001B[0;32m    915\u001B[0m         \u001B[38;5;28;01mraise\u001B[39;00m \u001B[38;5;167;01mValueError\u001B[39;00m(\n\u001B[0;32m    916\u001B[0m             \u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mFound array with dim \u001B[39m\u001B[38;5;132;01m%d\u001B[39;00m\u001B[38;5;124m. \u001B[39m\u001B[38;5;132;01m%s\u001B[39;00m\u001B[38;5;124m expected <= 2.\u001B[39m\u001B[38;5;124m\"\u001B[39m\n\u001B[0;32m    917\u001B[0m             \u001B[38;5;241m%\u001B[39m (array\u001B[38;5;241m.\u001B[39mndim, estimator_name)\n\u001B[0;32m    918\u001B[0m         )\n\u001B[0;32m    920\u001B[0m     \u001B[38;5;28;01mif\u001B[39;00m force_all_finite:\n\u001B[1;32m--> 921\u001B[0m         _assert_all_finite(\n\u001B[0;32m    922\u001B[0m             array,\n\u001B[0;32m    923\u001B[0m             input_name\u001B[38;5;241m=\u001B[39minput_name,\n\u001B[0;32m    924\u001B[0m             estimator_name\u001B[38;5;241m=\u001B[39mestimator_name,\n\u001B[0;32m    925\u001B[0m             allow_nan\u001B[38;5;241m=\u001B[39mforce_all_finite \u001B[38;5;241m==\u001B[39m \u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mallow-nan\u001B[39m\u001B[38;5;124m\"\u001B[39m,\n\u001B[0;32m    926\u001B[0m         )\n\u001B[0;32m    928\u001B[0m \u001B[38;5;28;01mif\u001B[39;00m ensure_min_samples \u001B[38;5;241m>\u001B[39m \u001B[38;5;241m0\u001B[39m:\n\u001B[0;32m    929\u001B[0m     n_samples \u001B[38;5;241m=\u001B[39m _num_samples(array)\n",
      "File \u001B[1;32mD:\\Anaconda\\Lib\\site-packages\\sklearn\\utils\\validation.py:161\u001B[0m, in \u001B[0;36m_assert_all_finite\u001B[1;34m(X, allow_nan, msg_dtype, estimator_name, input_name)\u001B[0m\n\u001B[0;32m    144\u001B[0m \u001B[38;5;28;01mif\u001B[39;00m estimator_name \u001B[38;5;129;01mand\u001B[39;00m input_name \u001B[38;5;241m==\u001B[39m \u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mX\u001B[39m\u001B[38;5;124m\"\u001B[39m \u001B[38;5;129;01mand\u001B[39;00m has_nan_error:\n\u001B[0;32m    145\u001B[0m     \u001B[38;5;66;03m# Improve the error message on how to handle missing values in\u001B[39;00m\n\u001B[0;32m    146\u001B[0m     \u001B[38;5;66;03m# scikit-learn.\u001B[39;00m\n\u001B[0;32m    147\u001B[0m     msg_err \u001B[38;5;241m+\u001B[39m\u001B[38;5;241m=\u001B[39m (\n\u001B[0;32m    148\u001B[0m         \u001B[38;5;124mf\u001B[39m\u001B[38;5;124m\"\u001B[39m\u001B[38;5;130;01m\\n\u001B[39;00m\u001B[38;5;132;01m{\u001B[39;00mestimator_name\u001B[38;5;132;01m}\u001B[39;00m\u001B[38;5;124m does not accept missing values\u001B[39m\u001B[38;5;124m\"\u001B[39m\n\u001B[0;32m    149\u001B[0m         \u001B[38;5;124m\"\u001B[39m\u001B[38;5;124m encoded as NaN natively. For supervised learning, you might want\u001B[39m\u001B[38;5;124m\"\u001B[39m\n\u001B[1;32m   (...)\u001B[0m\n\u001B[0;32m    159\u001B[0m         \u001B[38;5;124m\"\u001B[39m\u001B[38;5;124m#estimators-that-handle-nan-values\u001B[39m\u001B[38;5;124m\"\u001B[39m\n\u001B[0;32m    160\u001B[0m     )\n\u001B[1;32m--> 161\u001B[0m \u001B[38;5;28;01mraise\u001B[39;00m \u001B[38;5;167;01mValueError\u001B[39;00m(msg_err)\n",
      "\u001B[1;31mValueError\u001B[0m: Input X contains NaN.\nGradientBoostingClassifier does not accept missing values encoded as NaN natively. For supervised learning, you might want to consider sklearn.ensemble.HistGradientBoostingClassifier and Regressor which accept missing values encoded as NaNs natively. Alternatively, it is possible to preprocess the data, for instance by using an imputer transformer in a pipeline or drop samples with missing values. See https://scikit-learn.org/stable/modules/impute.html You can find a list of all estimators that handle NaN values at the following page: https://scikit-learn.org/stable/modules/impute.html#estimators-that-handle-nan-values"
     ]
    }
   ],
   "execution_count": 103
  },
  {
   "metadata": {},
   "cell_type": "code",
   "outputs": [],
   "execution_count": null,
   "source": [
    "from sklearn.metrics import roc_curve, auc \n",
    "def acu_curve(y,prob):\n",
    "    #  y真实,\n",
    "    #  prob预测\n",
    "    fpr,tpr,threshold = roc_curve(y,prob) ###计算真阳性率(真正率)和假阳性率(假正率)\n",
    "    roc_auc = auc(fpr,tpr) ###计算auc的值\n",
    " \n",
    "    plt.figure()\n",
    "    lw = 2\n",
    "    plt.figure(figsize=(12,10))\n",
    "    plt.plot(fpr, tpr, color='darkorange',\n",
    "             lw=lw, label='ROC curve (AUC = %0.3f)' % roc_auc) ###假正率为横坐标，真正率为纵坐标做曲线\n",
    "    plt.plot([0, 1], [0, 1], color='navy', lw=lw, linestyle='--')\n",
    "    plt.xlim([0.0, 1.0])\n",
    "    plt.ylim([0.0, 1.05])\n",
    "    plt.xlabel('False Positive Rate')\n",
    "    plt.ylabel('True Positive Rate')\n",
    "    plt.title('AUC')\n",
    "    plt.legend(loc=\"lower right\")\n",
    " \n",
    "    plt.show()\n",
    " \n",
    "acu_curve(y_test,lgb_sklearn_pre[:,1])"
   ],
   "id": "f0a542f21c36c1c8"
  },
  {
   "cell_type": "code",
   "id": "e5f97d8b-66ba-41f7-aaee-b85b6c6ed15a",
   "metadata": {},
   "source": [
    "from sklearn.preprocessing import LabelEncoder\n",
    "# 创建 LabelEncoder 实例\n",
    "label_encoder = LabelEncoder()\n",
    "\n",
    "# 将字符串列转换为数值\n",
    "for col in df_final.select_dtypes(include=['object']).columns:\n",
    "    df_final[col] = label_encoder.fit_transform(df_final[col])\n",
    "\n",
    "print(\"转换后的数据框：\")\n",
    "print(df_final)"
   ],
   "outputs": [],
   "execution_count": null
  },
  {
   "cell_type": "code",
   "id": "6a8731a9-ea1f-480e-bf81-2610157eb561",
   "metadata": {},
   "source": [
    "import xgboost as xgb\n",
    "from sklearn.model_selection import train_test_split\n",
    "X = df.loc[:,df.columns != 'target']  # 数据\n",
    "y = df.loc[:,df.columns == 'target']  # 标签\n",
    "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)\n",
    "X"
   ],
   "outputs": [],
   "execution_count": null
  },
  {
   "cell_type": "code",
   "id": "6d4cf6af-33ab-44e3-b6aa-7df37645442f",
   "metadata": {},
   "source": [
    "# 创建和训练 XGBoost 模型\n",
    "import xgboost as xgb\n",
    "model = xgb.XGBClassifier()\n",
    "model.fit(X_train, y_train)\n",
    "\n",
    "# 获取特征重要性\n",
    "importance = model.feature_importances_\n",
    "\n",
    "# 创建 DataFrame 以便于查看\n",
    "importance_df = pd.DataFrame({'Feature': X.columns, 'Importance': importance})\n",
    "importance_df = importance_df.sort_values(by='Importance', ascending=False).head(50)\n",
    "\n",
    "# 打印特征重要性\n",
    "print(importance_df)\n",
    "\n",
    "# 可视化特征重要性\n",
    "plt.figure(figsize=(10, 6))\n",
    "plt.barh(importance_df['Feature'], importance_df['Importance'])\n",
    "plt.xlabel('Importance')\n",
    "plt.title('Feature Importance from XGBoost')\n",
    "plt.show()"
   ],
   "outputs": [],
   "execution_count": null
  },
  {
   "cell_type": "code",
   "id": "64d8441d5b2c8624",
   "metadata": {},
   "source": [
    "# 特征选择\n",
    "# 卡方\n",
    "from sklearn.feature_selection import SelectKBest, chi2\n",
    "import sklearn\n",
    "XX= sklearn.preprocessing.MinMaxScaler().fit_transform(X)\n",
    "chi2_selector = SelectKBest(chi2, k=2)\n",
    "X_kbest = chi2_selector.fit_transform(XX, y)\n",
    "X_kbest"
   ],
   "outputs": [],
   "execution_count": null
  },
  {
   "cell_type": "code",
   "id": "569493f5-2a94-46a7-bba5-e1e1bd024d5a",
   "metadata": {},
   "source": [
    "# # 使用递归特征消除（RFE）\n",
    "# from sklearn.feature_selection import RFE\n",
    "# from sklearn.linear_model import LogisticRegression\n",
    "# # 使用逻辑回归进行递归特征消除\n",
    "# model = LogisticRegression()\n",
    "# rfe = RFE(model, n_features_to_select=2)\n",
    "# fit = rfe.fit(X, y)\n",
    "\n",
    "# print(\"选择的特征索引：\", fit.support_)\n",
    "# print(\"特征排名：\", fit.ranking_)"
   ],
   "outputs": [],
   "execution_count": null
  },
  {
   "cell_type": "code",
   "id": "b6e4f785-8e9c-48f5-a052-6eaa795fe562",
   "metadata": {},
   "source": [
    "# 降维\n",
    "from sklearn.decomposition import PCA\n",
    "from sklearn.preprocessing import StandardScaler\n",
    "# 标准化数据\n",
    "scaler = StandardScaler()\n",
    "scaled_data = scaler.fit_transform(df)\n",
    "\n",
    "# 使用 PCA 降维\n",
    "pca = PCA(n_components=2)\n",
    "reduced_data = pca.fit_transform(scaled_data)\n",
    "\n",
    "# 创建 DataFrame 并查看结果\n",
    "reduced_df = pd.DataFrame(data=reduced_data, columns=['PC1', 'PC2'])\n",
    "print(reduced_df)\n",
    "\n",
    "# 可视化降维后的数据\n",
    "plt.scatter(reduced_df['PC1'], reduced_df['PC2'])\n",
    "plt.xlabel('Principal Component 1')\n",
    "plt.ylabel('Principal Component 2')\n",
    "plt.title('PCA Result')\n",
    "plt.show()"
   ],
   "outputs": [],
   "execution_count": null
  },
  {
   "cell_type": "code",
   "id": "d8b15139-d22e-47d4-a773-ed64da8d28c3",
   "metadata": {},
   "source": [
    "reduced_data"
   ],
   "outputs": [],
   "execution_count": null
  },
  {
   "cell_type": "code",
   "id": "7172f704-04cc-4b07-a0d2-ff5e57096bfc",
   "metadata": {},
   "source": [
    "# from sklearn.discriminant_analysis import LinearDiscriminantAnalysis as LDA\n",
    "# # 创建 LDA 实例\n",
    "# lda = LDA(n_components=2)  # 降维到 2 维\n",
    "\n",
    "# # 拟合模型并进行转换\n",
    "# X_lda = lda.fit_transform(X, y)\n",
    "\n",
    "# # 将结果转换为 DataFrame，便于可视化\n",
    "# lda_df = pd.DataFrame(data=X_lda, columns=['LD1', 'LD2'])\n",
    "# lda_df['target'] = y\n",
    "\n",
    "# # 可视化结果\n",
    "# colors = ['red', 'green', 'blue']\n",
    "# targets = np.unique(y)\n",
    "\n",
    "# plt.figure(figsize=(8, 6))\n",
    "# for target, color in zip(targets, colors):\n",
    "#     plt.scatter(lda_df[lda_df['target'] == target]['LD1'], \n",
    "#                 lda_df[lda_df['target'] == target]['LD2'], \n",
    "#                 label=data.target_names[target], \n",
    "#                 color=color)\n",
    "# plt.title('LDA: Linear Discriminant Analysis')\n",
    "# plt.xlabel('LD1')\n",
    "# plt.ylabel('LD2')\n",
    "# plt.legend()\n",
    "# plt.grid()\n",
    "# plt.show()"
   ],
   "outputs": [],
   "execution_count": null
  },
  {
   "cell_type": "code",
   "id": "655f7aa4-5039-4724-940a-2943b85ea271",
   "metadata": {},
   "source": [
    "# from sklearn.linear_model import LogisticRegression\n",
    "from sklearn.metrics import roc_auc_score, roc_curve\n",
    "# # 创建逻辑回归模型\n",
    "# model = LogisticRegression()\n",
    "\n",
    "# # 训练模型\n",
    "# model.fit(X_train, y_train)\n",
    "# # 预测概率\n",
    "# y_pred = model.predict_proba(X_test)[:,1]\n",
    "# # 计算 AUC 值\n",
    "# # auc_value = roc_auc_score(y_test, y_pred)\n",
    "# # print(f\"AUC 值: {auc_value}\")"
   ],
   "outputs": [],
   "execution_count": null
  },
  {
   "cell_type": "code",
   "id": "9a977ac0-dd52-4b03-a1cb-42dac06111dd",
   "metadata": {},
   "source": [
    "from sklearn.ensemble import RandomForestClassifier\n",
    "from sklearn.metrics import accuracy_score\n",
    "# 随机森林分类器\n",
    "rf = RandomForestClassifier()\n",
    "# 拟合数据集\n",
    "clf = rf.fit(X_train, y_train.values.ravel())\n",
    "# 预测测试集\n",
    "y_pred = clf.predict(X_test)\n",
    "y_auc = roc_auc_score(y_test,y_pred)\n",
    "y_auc\n",
    "print(f'AUC: {y_auc}')"
   ],
   "outputs": [],
   "execution_count": null
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.12"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
